Skip to content

Commit 27d9d65

Browse files
authored
Merge pull request #65512 from keith/ks/fix-missing-indexing-data-when-using-self-initializer
Fix missing indexing data when using Self initializer
2 parents acc8a08 + 1d3a9ba commit 27d9d65

File tree

5 files changed

+81
-4
lines changed

5 files changed

+81
-4
lines changed

include/swift/AST/ASTWalker.h

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ struct ReferenceMetaData {
4848
SemaReferenceKind Kind;
4949
llvm::Optional<AccessKind> AccKind;
5050
bool isImplicit = false;
51+
bool isImplicitCtorType = false;
5152

5253
/// When non-none, this is a custom attribute reference.
5354
Optional<std::pair<const CustomAttr *, Decl *>> CustomAttrRef;

lib/IDE/SourceEntityWalker.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,18 @@ ASTWalker::PreWalkAction SemaAnnotator::walkToTypeReprPre(TypeRepr *T) {
633633
ReferenceMetaData(SemaReferenceKind::TypeRef, None));
634634
return Action::StopIf(!Continue);
635635
}
636+
} else if (auto FT = dyn_cast<FixedTypeRepr>(T)) {
637+
ValueDecl *VD = FT->getType()->getAnyGeneric();
638+
if (auto DT = FT->getType()->getAs<DynamicSelfType>())
639+
VD = DT->getSelfType()->getAnyGeneric();
640+
641+
if (VD) {
642+
auto Data = ReferenceMetaData(SemaReferenceKind::TypeRef, None);
643+
Data.isImplicitCtorType = true;
644+
auto Continue = passReference(VD, FT->getType(), FT->getLoc(),
645+
FT->getSourceRange(), Data);
646+
return Action::StopIf(!Continue);
647+
}
636648
}
637649

638650
return Action::Continue();

lib/IDE/Utils.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -849,8 +849,11 @@ bool swift::ide::isBeingCalled(ArrayRef<Expr *> ExprStack) {
849849
auto *AE = dyn_cast<ApplyExpr>(E);
850850
if (!AE || AE->isImplicit())
851851
continue;
852-
if (auto *CRCE = dyn_cast<ConstructorRefCallExpr>(AE)) {
853-
if (CRCE->getBase() == Target)
852+
if (auto *CRCE = dyn_cast<ConstructorRefCallExpr>(AE->getFn())) {
853+
auto *Base = CRCE->getBase();
854+
while (auto *ICE = dyn_cast<ImplicitConversionExpr>(Base))
855+
Base = ICE->getSubExpr();
856+
if (Base == Target)
854857
return true;
855858
}
856859
if (isa<SelfApplyExpr>(AE))

lib/Index/Index.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -857,9 +857,13 @@ class IndexSwiftASTWalker : public SourceEntityWalker {
857857
if (Data.isImplicit)
858858
Info.roles |= (unsigned)SymbolRole::Implicit;
859859

860-
if (CtorTyRef)
861-
if (!reportRef(CtorTyRef, Loc, Info, Data.AccKind))
860+
if (CtorTyRef) {
861+
IndexSymbol CtorInfo(Info);
862+
if (Data.isImplicitCtorType)
863+
CtorInfo.roles |= (unsigned)SymbolRole::Implicit;
864+
if (!reportRef(CtorTyRef, Loc, CtorInfo, Data.AccKind))
862865
return false;
866+
}
863867

864868
if (auto *GenParam = dyn_cast<GenericTypeParamDecl>(D)) {
865869
D = canonicalizeGenericTypeParamDeclForIndex(GenParam);

test/Index/index_self.swift

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// RUN: %target-swift-ide-test -print-indexed-symbols -source-filename %s | %FileCheck %s
2+
3+
struct Foo { // CHECK: [[@LINE]]:8 | struct/Swift | Foo | [[Foo_USR:.*]] | Def | rel: 0
4+
init() {} // CHECK: [[@LINE]]:3 | constructor/Swift | init() | [[Foo_init_USR:.*]] | Def,RelChild | rel: 1
5+
6+
static func bar() -> Self {
7+
.init() // CHECK: [[@LINE]]:6 | constructor/Swift | init() | [[Foo_init_USR]] | Ref,Call,RelCall,RelCont | rel: 1
8+
}
9+
10+
static func baz() -> Self {
11+
Self()
12+
// CHECK: [[@LINE-1]]:5 | struct/Swift | Foo | [[Foo_USR]] | Ref,Impl,RelCont | rel: 1
13+
// CHECK: [[@LINE-2]]:5 | constructor/Swift | init() | [[Foo_init_USR]] | Ref,Call,RelCall,RelCont | rel: 1
14+
}
15+
}
16+
17+
final class Final { // CHECK: [[@LINE]]:13 | class/Swift | Final | [[Final_USR:.*]] | Def | rel: 0
18+
init() {} // CHECK: [[@LINE]]:3 | constructor/Swift | init() | [[Final_init_USR:.*]] | Def,RelChild | rel: 1
19+
20+
static func foo() -> Self {
21+
.init() // CHECK: [[@LINE]]:6 | constructor/Swift | init() | [[Final_init_USR]] | Ref,Call,RelCall,RelCont | rel: 1
22+
}
23+
24+
static func baz() -> Self {
25+
Self()
26+
// CHECK: [[@LINE-1]]:5 | class/Swift | Final | [[Final_USR]] | Ref,Impl,RelCont | rel: 1
27+
// CHECK: [[@LINE-2]]:5 | constructor/Swift | init() | [[Final_init_USR]] | Ref,Call,RelCall,RelCont | rel: 1
28+
}
29+
}
30+
31+
class Bar { // CHECK: [[@LINE]]:7 | class/Swift | Bar | [[Bar_USR:.*]] | Def | rel: 0
32+
required init() {} // CHECK: [[@LINE]]:12 | constructor/Swift | init() | [[Bar_init_USR:.*]] | Def,RelChild | rel: 1
33+
34+
static func foo() -> Self {
35+
.init() // CHECK: [[@LINE]]:6 | constructor/Swift | init() | [[Bar_init_USR]] | Ref,Call,RelCall,RelCont | rel: 1
36+
}
37+
38+
static func baz() -> Self {
39+
Self()
40+
// CHECK: [[@LINE-1]]:5 | class/Swift | Bar | [[Bar_USR]] | Ref,Impl,RelCont | rel: 1
41+
// TODO: This reference should be dynamic
42+
// CHECK: [[@LINE-3]]:5 | constructor/Swift | init() | [[Bar_init_USR]] | Ref,Call,RelCall,RelCont | rel: 1
43+
}
44+
}
45+
46+
class Baz: Bar {}
47+
48+
protocol Proto { // CHECK: [[@LINE]]:10 | protocol/Swift | Proto | [[Proto_USR:.*]] | Def | rel: 0
49+
init() // CHECK: [[@LINE]]:3 | constructor/Swift | init() | [[Proto_init_USR:.*]] | Def,RelChild | rel: 1
50+
}
51+
52+
extension Proto {
53+
func foo() -> Self {
54+
// TODO: This reference should be dynamic
55+
Self() // CHECK: [[@LINE]]:5 | constructor/Swift | init() | [[Proto_init_USR]] | Ref,Call,RelCall,RelCont | rel: 1
56+
}
57+
}

0 commit comments

Comments
 (0)