Skip to content

Commit d0d3d42

Browse files
committed
[SourceKit] In related identes, report underlying var of shorthand if let binding
1 parent 64e27a2 commit d0d3d42

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

test/SourceKit/RelatedIdents/related_idents.swift

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,18 @@ func closureCaptureWithExplicitName() {
9393
}
9494
}
9595

96+
func shorthandIfLet(test: Int?) {
97+
if let test {
98+
print(test)
99+
}
100+
}
101+
102+
func ifLet(test: Int?) {
103+
if let test = test {
104+
print(test)
105+
}
106+
}
107+
96108
// RUN: %sourcekitd-test -req=related-idents -pos=6:17 %s -- -module-name related_idents %s | %FileCheck -check-prefix=CHECK1 %s
97109
// CHECK1: START RANGES
98110
// CHECK1-NEXT: 1:7 - 2
@@ -208,3 +220,26 @@ func closureCaptureWithExplicitName() {
208220
// CHECK14-NEXT: 91:20 - 4
209221
// CHECK14-NEXT: 92:11 - 4
210222
// CHECK14-NEXT: END RANGES
223+
224+
// RUN: %sourcekitd-test -req=related-idents -pos=96:21 %s -- -module-name related_idents %s | %FileCheck -check-prefix=CHECK15 %s
225+
// RUN: %sourcekitd-test -req=related-idents -pos=97:10 %s -- -module-name related_idents %s | %FileCheck -check-prefix=CHECK15 %s
226+
// RUN: %sourcekitd-test -req=related-idents -pos=98:11 %s -- -module-name related_idents %s | %FileCheck -check-prefix=CHECK15 %s
227+
// CHECK15: START RANGES
228+
// CHECK15-NEXT: 96:21 - 4
229+
// CHECK15-NEXT: 97:10 - 4
230+
// CHECK15-NEXT: 98:11 - 4
231+
// CHECK15-NEXT: END RANGES
232+
233+
// RUN: %sourcekitd-test -req=related-idents -pos=102:12 %s -- -module-name related_idents %s | %FileCheck -check-prefix=CHECK16 %s
234+
// RUN: %sourcekitd-test -req=related-idents -pos=103:17 %s -- -module-name related_idents %s | %FileCheck -check-prefix=CHECK16 %s
235+
// CHECK16: START RANGES
236+
// CHECK16-NEXT: 102:12 - 4
237+
// CHECK16-NEXT: 103:17 - 4
238+
// CHECK16-NEXT: END RANGES
239+
240+
// RUN: %sourcekitd-test -req=related-idents -pos=103:10 %s -- -module-name related_idents %s | %FileCheck -check-prefix=CHECK17 %s
241+
// RUN: %sourcekitd-test -req=related-idents -pos=104:11 %s -- -module-name related_idents %s | %FileCheck -check-prefix=CHECK17 %s
242+
// CHECK17: START RANGES
243+
// CHECK17-NEXT: 103:10 - 4
244+
// CHECK17-NEXT: 104:11 - 4
245+
// CHECK17-NEXT: END RANGES

tools/SourceKit/lib/SwiftLang/SwiftSourceDocInfo.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2234,6 +2234,41 @@ class RelatedIdScanner : public SourceEntityWalker {
22342234
return true;
22352235
}
22362236

2237+
bool walkToStmtPre(Stmt *S) override {
2238+
if (Cancelled)
2239+
return false;
2240+
2241+
if (auto CondStmt = dyn_cast<LabeledConditionalStmt>(S)) {
2242+
for (const StmtConditionElement &Cond : CondStmt->getCond()) {
2243+
if (Cond.getKind() != StmtConditionElement::CK_PatternBinding) {
2244+
continue;
2245+
}
2246+
auto Init = dyn_cast<DeclRefExpr>(Cond.getInitializer());
2247+
if (!Init) {
2248+
continue;
2249+
}
2250+
auto ReferencedVar = dyn_cast_or_null<VarDecl>(Init->getDecl());
2251+
if (!ReferencedVar) {
2252+
continue;
2253+
}
2254+
2255+
Cond.getPattern()->forEachVariable([&](VarDecl *DeclaredVar) {
2256+
if (DeclaredVar->getLoc() != Init->getLoc()) {
2257+
return;
2258+
}
2259+
assert(DeclaredVar->getName() == ReferencedVar->getName());
2260+
if (DeclaredVar == Dcl) {
2261+
RelatedDecls.push_back(ReferencedVar);
2262+
}
2263+
if (ReferencedVar == Dcl) {
2264+
RelatedDecls.push_back(DeclaredVar);
2265+
}
2266+
});
2267+
}
2268+
}
2269+
return true;
2270+
}
2271+
22372272
bool walkToDeclPre(Decl *D, CharSourceRange Range) override {
22382273
if (Cancelled)
22392274
return false;

0 commit comments

Comments
 (0)