Skip to content

Commit 05d41ae

Browse files
authored
Merge pull request #6405 from nkcsgexi/referenced-type
2 parents 943af00 + ba930de commit 05d41ae

File tree

3 files changed

+81
-20
lines changed

3 files changed

+81
-20
lines changed

include/swift/IDE/Utils.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,15 +205,23 @@ enum class RangeKind : int8_t{
205205
MultiStatement,
206206
};
207207

208+
struct ReferencedDecl {
209+
ValueDecl *VD;
210+
Type Ty;
211+
ReferencedDecl(ValueDecl* VD, Type Ty) : VD(VD), Ty(Ty) {}
212+
ReferencedDecl() : ReferencedDecl(nullptr, Type()) {}
213+
bool operator==(const ReferencedDecl& other);
214+
};
215+
208216
struct ResolvedRangeInfo {
209217
RangeKind Kind;
210218
Type Ty;
211219
StringRef Content;
212220
ArrayRef<ValueDecl*> DeclaredDecls;
213-
ArrayRef<ValueDecl*> ReferencedDecls;
221+
ArrayRef<ReferencedDecl> ReferencedDecls;
214222
ResolvedRangeInfo(RangeKind Kind, Type Ty, StringRef Content,
215223
ArrayRef<ValueDecl*> DeclaredDecls,
216-
ArrayRef<ValueDecl*> ReferencedDecls): Kind(Kind),
224+
ArrayRef<ReferencedDecl> ReferencedDecls): Kind(Kind),
217225
Ty(Ty), Content(Content), DeclaredDecls(DeclaredDecls),
218226
ReferencedDecls(ReferencedDecls) {}
219227
ResolvedRangeInfo() :

lib/IDE/SwiftSourceDocInfo.cpp

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -207,12 +207,19 @@ void ResolvedRangeInfo::print(llvm::raw_ostream &OS) {
207207
for (auto *VD : DeclaredDecls) {
208208
OS << "<Declared>" << VD->getNameStr() << "</Declared>\n";
209209
}
210-
for (auto *VD : ReferencedDecls) {
211-
OS << "<Referenced>" << VD->getNameStr() << "</Referenced>\n";
210+
for (auto &RD : ReferencedDecls) {
211+
OS << "<Referenced>" << RD.VD->getNameStr() << "</Referenced>";
212+
OS << "<Type>";
213+
RD.Ty->print(OS);
214+
OS << "</Type>\n";
212215
}
213216
OS << "<end>\n";
214217
}
215218

219+
bool ReferencedDecl::operator==(const ReferencedDecl& Other) {
220+
return VD == Other.VD && Ty.getPointer() == Other.Ty.getPointer();
221+
}
222+
216223
struct RangeResolver::Implementation {
217224
SourceFile &File;
218225
ASTContext &Ctx;
@@ -243,13 +250,7 @@ struct RangeResolver::Implementation {
243250
}
244251

245252
std::vector<ValueDecl*> DeclaredDecls;
246-
std::vector<ValueDecl*> ReferencedDecls;
247-
248-
void pushBackDeclUniquely(std::vector<ValueDecl*> &Bag, ValueDecl* VD) {
249-
if (std::find(Bag.begin(), Bag.end(), VD) == Bag.end()) {
250-
Bag.push_back(VD);
251-
}
252-
}
253+
std::vector<ReferencedDecl> ReferencedDecls;
253254

254255
ResolvedRangeInfo getSingleNodeKind(ASTNode Node) {
255256
assert(!Node.isNull());
@@ -341,6 +342,8 @@ struct RangeResolver::Implementation {
341342

342343
static Implementation *createInstance(SourceFile &File, SourceLoc Start,
343344
SourceLoc End) {
345+
if (Start.isInvalid() || End.isInvalid())
346+
return nullptr;
344347
SourceManager &SM = File.getASTContext().SourceMgr;
345348
unsigned BufferId = File.getBufferID().getValue();
346349
unsigned StartOff = SM.getLocOffsetInBuffer(Start, BufferId);
@@ -355,7 +358,7 @@ struct RangeResolver::Implementation {
355358
if (auto *VD = dyn_cast_or_null<ValueDecl>(D)) {
356359
if (isContainedInSelection(CharSourceRange(SM, VD->getStartLoc(),
357360
VD->getEndLoc())))
358-
pushBackDeclUniquely(DeclaredDecls, VD);
361+
DeclaredDecls.push_back(VD);
359362
}
360363

361364
auto &DCInfo = getCurrentDC();
@@ -400,7 +403,7 @@ struct RangeResolver::Implementation {
400403
return ResolvedRangeInfo();
401404
}
402405

403-
void analyzeDeclRef(ValueDecl *VD, CharSourceRange Range) {
406+
void analyzeDeclRef(ValueDecl *VD, CharSourceRange Range, Type Ty) {
404407
if (!isContainedInSelection(Range))
405408
return;
406409

@@ -409,7 +412,10 @@ struct RangeResolver::Implementation {
409412
return;
410413

411414
// Collect referenced decls in the range.
412-
pushBackDeclUniquely(ReferencedDecls, VD);
415+
ReferencedDecl RD(VD, Ty);
416+
if (std::find(ReferencedDecls.begin(), ReferencedDecls.end(), RD) ==
417+
ReferencedDecls.end())
418+
ReferencedDecls.push_back(RD);
413419
}
414420

415421
private:
@@ -483,7 +489,7 @@ bool RangeResolver::walkToDeclPost(Decl *D) {
483489
bool RangeResolver::
484490
visitDeclReference(ValueDecl *D, CharSourceRange Range, TypeDecl *CtorTyRef,
485491
Type T) {
486-
Impl->analyzeDeclRef(D, Range);
492+
Impl->analyzeDeclRef(D, Range, T);
487493
return true;
488494
}
489495

test/IDE/range_info_basics.swift

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,37 @@ func foo2() {
1717
print(b + c)
1818
}
1919

20+
struct S1 {
21+
var a = 3
22+
func foo() -> Int { return 0 }
23+
mutating func increment() -> S1 {
24+
a = a + 1
25+
return self
26+
}
27+
}
28+
29+
func foo3(s: inout S1) -> Int {
30+
let b = s.a
31+
let c = s.foo() + b
32+
s = s.increment()
33+
return c + b
34+
}
35+
36+
func foo4(s: S1) -> Int {
37+
let b = s.a
38+
let c = s.foo() + b
39+
return c + b
40+
}
41+
2042
// RUN: %target-swift-ide-test -range -pos=8:1 -end-pos 8:32 -source-filename %s | %FileCheck %s -check-prefix=CHECK1
2143
// RUN: %target-swift-ide-test -range -pos=9:1 -end-pos 9:26 -source-filename %s | %FileCheck %s -check-prefix=CHECK2
2244
// RUN: %target-swift-ide-test -range -pos=10:1 -end-pos 10:27 -source-filename %s | %FileCheck %s -check-prefix=CHECK3
2345
// RUN: %target-swift-ide-test -range -pos=3:1 -end-pos=4:26 -source-filename %s | %FileCheck %s -check-prefix=CHECK4
2446
// RUN: %target-swift-ide-test -range -pos=3:1 -end-pos=5:13 -source-filename %s | %FileCheck %s -check-prefix=CHECK5
2547
// RUN: %target-swift-ide-test -range -pos=4:1 -end-pos=5:13 -source-filename %s | %FileCheck %s -check-prefix=CHECK6
2648
// RUN: %target-swift-ide-test -range -pos=14:1 -end-pos=17:15 -source-filename %s | %FileCheck %s -check-prefix=CHECK7
49+
// RUN: %target-swift-ide-test -range -pos=31:1 -end-pos=33:15 -source-filename %s | %FileCheck %s -check-prefix=CHECK8
50+
// RUN: %target-swift-ide-test -range -pos=37:1 -end-pos=39:15 -source-filename %s | %FileCheck %s -check-prefix=CHECK9
2751

2852
// CHECK1: <Kind>SingleDecl</Kind>
2953
// CHECK1-NEXT: <Content>func foo1() -> Int { return 0 }</Content>
@@ -43,20 +67,20 @@ func foo2() {
4367
// CHECK4: <Kind>MultiStatement</Kind>
4468
// CHECK4-NEXT: <Content>aaa = aaa + 3
4569
// CHECK4-NEXT: if aaa == 3 { aaa = 4 }</Content>
46-
// CHECK4-NEXT: <Referenced>aaa</Referenced>
70+
// CHECK4-NEXT: <Referenced>aaa</Referenced><Type>@lvalue Int</Type>
4771
// CHECK4-NEXT: <end>
4872

4973
// CHECK5: <Kind>MultiStatement</Kind>
5074
// CHECK5-NEXT: <Content>aaa = aaa + 3
5175
// CHECK5-NEXT: if aaa == 3 { aaa = 4 }
5276
// CHECK5-NEXT: return aaa</Content>
53-
// CHECK5-NEXT: <Referenced>aaa</Referenced>
77+
// CHECK5-NEXT: <Referenced>aaa</Referenced><Type>@lvalue Int</Type>
5478
// CHECK5-NEXT: <end>
5579

5680
// CHECK6: <Kind>MultiStatement</Kind>
5781
// CHECK6-NEXT: if aaa == 3 { aaa = 4 }
5882
// CHECK6-NEXT: return aaa</Content>
59-
// CHECK6-NEXT: <Referenced>aaa</Referenced>
83+
// CHECK6-NEXT: <Referenced>aaa</Referenced><Type>@lvalue Int</Type>
6084
// CHECK6-NEXT: <end>
6185

6286
// CHECK7: <Kind>MultiStatement</Kind>
@@ -66,6 +90,29 @@ func foo2() {
6690
// CHECK7-NEXT: print(b + c)</Content>
6791
// CHECK7-NEXT: <Declared>b</Declared>
6892
// CHECK7-NEXT: <Declared>c</Declared>
69-
// CHECK7-NEXT: <Referenced>a</Referenced>
70-
// CHECK7-NEXT: <Referenced>b</Referenced>
93+
// CHECK7-NEXT: <Referenced>a</Referenced><Type>Int</Type>
94+
// CHECK7-NEXT: <Referenced>b</Referenced><Type>@lvalue Int</Type>
7195
// CHECK7-NEXT: <end>
96+
97+
// CHECK8: <Kind>MultiStatement</Kind>
98+
// CHECK8-NEXT: <Content>let c = s.foo() + b
99+
// CHECK8-NEXT: s = s.increment()
100+
// CHECK8-NEXT: return c + b</Content>
101+
// CHECK8-NEXT: <Declared>c</Declared>
102+
// CHECK8-NEXT: <Referenced>s</Referenced><Type>@lvalue S1</Type>
103+
// CHECK8-NEXT: <Referenced>foo</Referenced><Type>(S1) -> () -> Int</Type>
104+
// CHECK8-NEXT: <Referenced>b</Referenced><Type>Int</Type>
105+
// CHECK8-NEXT: <Referenced>increment</Referenced><Type>(inout S1) -> () -> S1</Type>
106+
// CHECK8-NEXT: <end>
107+
108+
// CHECK9: <Kind>MultiStatement</Kind>
109+
// CHECK9-NEXT: <Content>let b = s.a
110+
// CHECK9-NEXT: let c = s.foo() + b
111+
// CHECK9-NEXT: return c + b</Content>
112+
// CHECK9-NEXT: <Declared>b</Declared>
113+
// CHECK9-NEXT: <Declared>c</Declared>
114+
// CHECK9-NEXT: <Referenced>s</Referenced><Type>S1</Type>
115+
// CHECK9-NEXT: <Referenced>a</Referenced><Type>Int</Type>
116+
// CHECK9-NEXT: <Referenced>foo</Referenced><Type>(S1) -> () -> Int</Type>
117+
// CHECK9-NEXT: <Referenced>b</Referenced><Type>Int</Type>
118+
// CHECK9-NEXT: <end>

0 commit comments

Comments
 (0)