Skip to content

Commit 2312cce

Browse files
committed
[RangeInfo] When reporting referenced decls in a given range, exclude those references accessed as members.
1 parent 14f968a commit 2312cce

File tree

3 files changed

+64
-7
lines changed

3 files changed

+64
-7
lines changed

lib/AST/SourceEntityWalker.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,14 @@ Stmt *SemaAnnotator::walkToStmtPost(Stmt *S) {
192192
return Continue ? S : nullptr;
193193
}
194194

195+
static SemaReferenceKind getReferenceKind(Expr *Parent, Expr *E) {
196+
if (auto SA = dyn_cast_or_null<SelfApplyExpr>(Parent)) {
197+
if (SA->getFn() == E)
198+
return SemaReferenceKind::DeclMemberRef;
199+
}
200+
return SemaReferenceKind::DeclRef;
201+
}
202+
195203
std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
196204
if (isDone())
197205
return { false, nullptr };
@@ -212,7 +220,7 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
212220
return { false, nullptr };
213221
} else if (!passReference(DRE->getDecl(), DRE->getType(),
214222
DRE->getNameLoc(),
215-
SemaReferenceKind::DeclRef)) {
223+
getReferenceKind(Parent.getAsExpr(), E))) {
216224
return { false, nullptr };
217225
}
218226
} else if (MemberRefExpr *MRE = dyn_cast<MemberRefExpr>(E)) {

lib/IDE/SwiftSourceDocInfo.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,12 @@ struct RangeResolver::Implementation {
423423
return ResolvedRangeInfo();
424424
}
425425

426-
void analyzeDeclRef(ValueDecl *VD, CharSourceRange Range, Type Ty) {
426+
void analyzeDeclRef(ValueDecl *VD, CharSourceRange Range, Type Ty,
427+
SemaReferenceKind Kind) {
428+
// Only collect decl ref.
429+
if (Kind != SemaReferenceKind::DeclRef)
430+
return;
431+
427432
if (!isContainedInSelection(Range))
428433
return;
429434

@@ -509,7 +514,7 @@ bool RangeResolver::walkToDeclPost(Decl *D) {
509514
bool RangeResolver::
510515
visitDeclReference(ValueDecl *D, CharSourceRange Range, TypeDecl *CtorTyRef,
511516
Type T, SemaReferenceKind Kind) {
512-
Impl->analyzeDeclRef(D, Range, T);
517+
Impl->analyzeDeclRef(D, Range, T, Kind);
513518
return true;
514519
}
515520

test/IDE/range_info_basics.swift

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,19 @@ func foo4(s: S1) -> Int {
3939
return c + b
4040
}
4141

42+
class C1 {
43+
func getC() -> C1 { return self }
44+
func take(another : C1) -> C1 {return another }
45+
let c = C1()
46+
}
47+
48+
func foo5(c : C1) -> C1 {
49+
let a = c.c.getC().c.getC().getC().getC()
50+
let b = a.c.c.c.c.getC().getC()
51+
let d = a.c.getC().getC().c.c
52+
return a.take(another: b).take(another: d)
53+
}
54+
4255
// RUN: %target-swift-ide-test -range -pos=8:1 -end-pos 8:32 -source-filename %s | %FileCheck %s -check-prefix=CHECK1
4356
// RUN: %target-swift-ide-test -range -pos=9:1 -end-pos 9:26 -source-filename %s | %FileCheck %s -check-prefix=CHECK2
4457
// RUN: %target-swift-ide-test -range -pos=10:1 -end-pos 10:27 -source-filename %s | %FileCheck %s -check-prefix=CHECK3
@@ -48,6 +61,9 @@ func foo4(s: S1) -> Int {
4861
// RUN: %target-swift-ide-test -range -pos=14:1 -end-pos=17:15 -source-filename %s | %FileCheck %s -check-prefix=CHECK7
4962
// RUN: %target-swift-ide-test -range -pos=31:1 -end-pos=33:15 -source-filename %s | %FileCheck %s -check-prefix=CHECK8
5063
// RUN: %target-swift-ide-test -range -pos=37:1 -end-pos=39:15 -source-filename %s | %FileCheck %s -check-prefix=CHECK9
64+
// RUN: %target-swift-ide-test -range -pos=49:1 -end-pos=50:34 -source-filename %s | %FileCheck %s -check-prefix=CHECK10
65+
// RUN: %target-swift-ide-test -range -pos=49:1 -end-pos=51:32 -source-filename %s | %FileCheck %s -check-prefix=CHECK11
66+
// RUN: %target-swift-ide-test -range -pos=49:1 -end-pos=52:45 -source-filename %s | %FileCheck %s -check-prefix=CHECK12
5167

5268
// CHECK1: <Kind>SingleDecl</Kind>
5369
// CHECK1-NEXT: <Content>func foo1() -> Int { return 0 }</Content>
@@ -105,9 +121,7 @@ func foo4(s: S1) -> Int {
105121
// CHECK8-NEXT: <Type>Int</Type>
106122
// CHECK8-NEXT: <Declared>c</Declared>
107123
// CHECK8-NEXT: <Referenced>s</Referenced><Type>@lvalue S1</Type>
108-
// CHECK8-NEXT: <Referenced>foo</Referenced><Type>(S1) -> () -> Int</Type>
109124
// CHECK8-NEXT: <Referenced>b</Referenced><Type>Int</Type>
110-
// CHECK8-NEXT: <Referenced>increment</Referenced><Type>(inout S1) -> () -> S1</Type>
111125
// CHECK8-NEXT: <end>
112126

113127
// CHECK9: <Kind>MultiStatement</Kind>
@@ -118,7 +132,37 @@ func foo4(s: S1) -> Int {
118132
// CHECK9-NEXT: <Declared>b</Declared>
119133
// CHECK9-NEXT: <Declared>c</Declared>
120134
// CHECK9-NEXT: <Referenced>s</Referenced><Type>S1</Type>
121-
// CHECK9-NEXT: <Referenced>a</Referenced><Type>Int</Type>
122-
// CHECK9-NEXT: <Referenced>foo</Referenced><Type>(S1) -> () -> Int</Type>
123135
// CHECK9-NEXT: <Referenced>b</Referenced><Type>Int</Type>
124136
// CHECK9-NEXT: <end>
137+
138+
// CHECK10: <Kind>MultiStatement</Kind>
139+
// CHECK10-NEXT: <Content>let a = c.c.getC().c.getC().getC().getC()
140+
// CHECK10-NEXT: let b = a.c.c.c.c.getC().getC()</Content>
141+
// CHECK10-NEXT: <Declared>a</Declared>
142+
// CHECK10-NEXT: <Declared>b</Declared>
143+
// CHECK10-NEXT: <Referenced>c</Referenced><Type>C1</Type>
144+
// CHECK10-NEXT: <end>
145+
146+
// CHECK11: <Kind>MultiStatement</Kind>
147+
// CHECK11-NEXT: <Content>let a = c.c.getC().c.getC().getC().getC()
148+
// CHECK11-NEXT: let b = a.c.c.c.c.getC().getC()
149+
// CHECK11-NEXT: let d = a.c.getC().getC().c.c</Content>
150+
// CHECK11-NEXT: <Declared>a</Declared>
151+
// CHECK11-NEXT: <Declared>b</Declared>
152+
// CHECK11-NEXT: <Declared>d</Declared>
153+
// CHECK11-NEXT: <Referenced>c</Referenced><Type>C1</Type>
154+
// CHECK11-NEXT: <Referenced>a</Referenced><Type>C1</Type>
155+
// CHECK11-NEXT: <end>
156+
157+
// CHECK12: <Kind>MultiStatement</Kind>
158+
// CHECK12-NEXT: <Content>let a = c.c.getC().c.getC().getC().getC()
159+
// CHECK12-NEXT: let b = a.c.c.c.c.getC().getC()
160+
// CHECK12-NEXT: let d = a.c.getC().getC().c.c
161+
// CHECK12-NEXT: return a.take(another: b).take(another: d)</Content>
162+
// CHECK12-NEXT: <Type>C1</Type>
163+
// CHECK12-NEXT: <Declared>a</Declared>
164+
// CHECK12-NEXT: <Declared>b</Declared>
165+
// CHECK12-NEXT: <Declared>d</Declared>
166+
// CHECK12-NEXT: <Referenced>c</Referenced><Type>C1</Type>
167+
// CHECK12-NEXT: <Referenced>a</Referenced><Type>C1</Type>
168+
// CHECK12-NEXT: <end>

0 commit comments

Comments
 (0)