Skip to content

Commit 943af00

Browse files
authored
Merge pull request #6404 from nkcsgexi/range-reference-exclude
2 parents 97b0644 + 87a4b8a commit 943af00

File tree

2 files changed

+32
-10
lines changed

2 files changed

+32
-10
lines changed

lib/IDE/SwiftSourceDocInfo.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -349,16 +349,21 @@ struct RangeResolver::Implementation {
349349
}
350350

351351
void analyze(ASTNode Node) {
352+
Decl *D = Node.is<Decl*>() ? Node.get<Decl*>() : nullptr;
353+
352354
// Collect declared decls in the range.
353-
if (Node.is<Decl*>()) {
354-
if (auto *VD = dyn_cast<ValueDecl>(Node.get<Decl*>())) {
355+
if (auto *VD = dyn_cast_or_null<ValueDecl>(D)) {
356+
if (isContainedInSelection(CharSourceRange(SM, VD->getStartLoc(),
357+
VD->getEndLoc())))
355358
pushBackDeclUniquely(DeclaredDecls, VD);
356-
}
357359
}
358360

359361
auto &DCInfo = getCurrentDC();
360362
switch (getRangeMatchKind(Node.getSourceRange())) {
361363
case RangeMatchKind::NoneMatch:
364+
// PatternBindingDecl is not visited; we need to explicitly analyze here.
365+
if (auto *VA = dyn_cast_or_null<VarDecl>(D))
366+
analyze(VA->getParentPatternBinding());
362367
return;
363368
case RangeMatchKind::RangeMatch:
364369
Result = getSingleNodeKind(Node);
@@ -398,6 +403,11 @@ struct RangeResolver::Implementation {
398403
void analyzeDeclRef(ValueDecl *VD, CharSourceRange Range) {
399404
if (!isContainedInSelection(Range))
400405
return;
406+
407+
// If the VD is declared outside of current file, exclude such decl.
408+
if (VD->getDeclContext()->getParentSourceFile() != &File)
409+
return;
410+
401411
// Collect referenced decls in the range.
402412
pushBackDeclUniquely(ReferencedDecls, VD);
403413
}

test/IDE/range_info_basics.swift

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,21 @@ func foo1() -> Int { return 0 }
99
class C { func foo() {} }
1010
struct S { func foo() {} }
1111

12+
func foo2() {
13+
let a = 3
14+
var b = a.bigEndian
15+
let c = a.byteSwapped
16+
b = b.bigEndian.bigEndian.byteSwapped
17+
print(b + c)
18+
}
1219

1320
// RUN: %target-swift-ide-test -range -pos=8:1 -end-pos 8:32 -source-filename %s | %FileCheck %s -check-prefix=CHECK1
1421
// RUN: %target-swift-ide-test -range -pos=9:1 -end-pos 9:26 -source-filename %s | %FileCheck %s -check-prefix=CHECK2
1522
// RUN: %target-swift-ide-test -range -pos=10:1 -end-pos 10:27 -source-filename %s | %FileCheck %s -check-prefix=CHECK3
1623
// RUN: %target-swift-ide-test -range -pos=3:1 -end-pos=4:26 -source-filename %s | %FileCheck %s -check-prefix=CHECK4
1724
// RUN: %target-swift-ide-test -range -pos=3:1 -end-pos=5:13 -source-filename %s | %FileCheck %s -check-prefix=CHECK5
1825
// RUN: %target-swift-ide-test -range -pos=4:1 -end-pos=5:13 -source-filename %s | %FileCheck %s -check-prefix=CHECK6
26+
// RUN: %target-swift-ide-test -range -pos=14:1 -end-pos=17:15 -source-filename %s | %FileCheck %s -check-prefix=CHECK7
1927

2028
// CHECK1: <Kind>SingleDecl</Kind>
2129
// CHECK1-NEXT: <Content>func foo1() -> Int { return 0 }</Content>
@@ -35,25 +43,29 @@ struct S { func foo() {} }
3543
// CHECK4: <Kind>MultiStatement</Kind>
3644
// CHECK4-NEXT: <Content>aaa = aaa + 3
3745
// CHECK4-NEXT: if aaa == 3 { aaa = 4 }</Content>
38-
// CHECK4-NEXT: <Declared>foo</Declared>
3946
// CHECK4-NEXT: <Referenced>aaa</Referenced>
40-
// CHECK4-NEXT: <Referenced>+</Referenced>
4147
// CHECK4-NEXT: <end>
4248

4349
// CHECK5: <Kind>MultiStatement</Kind>
4450
// CHECK5-NEXT: <Content>aaa = aaa + 3
4551
// CHECK5-NEXT: if aaa == 3 { aaa = 4 }
4652
// CHECK5-NEXT: return aaa</Content>
47-
// CHECK5-NEXT: <Declared>foo</Declared>
4853
// CHECK5-NEXT: <Referenced>aaa</Referenced>
49-
// CHECK5-NEXT: <Referenced>+</Referenced>
50-
// CHECK5-NEXT: <Referenced>==</Referenced>
5154
// CHECK5-NEXT: <end>
5255

5356
// CHECK6: <Kind>MultiStatement</Kind>
5457
// CHECK6-NEXT: if aaa == 3 { aaa = 4 }
5558
// CHECK6-NEXT: return aaa</Content>
56-
// CHECK6-NEXT: <Declared>foo</Declared>
5759
// CHECK6-NEXT: <Referenced>aaa</Referenced>
58-
// CHECK6-NEXT: <Referenced>==</Referenced>
5960
// CHECK6-NEXT: <end>
61+
62+
// CHECK7: <Kind>MultiStatement</Kind>
63+
// CHECK7-NEXT: <Content>var b = a.bigEndian
64+
// CHECK7-NEXT: let c = a.byteSwapped
65+
// CHECK7-NEXT: b = b.bigEndian.bigEndian.byteSwapped
66+
// CHECK7-NEXT: print(b + c)</Content>
67+
// CHECK7-NEXT: <Declared>b</Declared>
68+
// CHECK7-NEXT: <Declared>c</Declared>
69+
// CHECK7-NEXT: <Referenced>a</Referenced>
70+
// CHECK7-NEXT: <Referenced>b</Referenced>
71+
// CHECK7-NEXT: <end>

0 commit comments

Comments
 (0)