Skip to content

Commit dbefa60

Browse files
committed
[RangeInfo] Report the type the selected code should be evaluated to.
1 parent 5ec82c7 commit dbefa60

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

lib/IDE/SwiftSourceDocInfo.cpp

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -252,20 +252,36 @@ struct RangeResolver::Implementation {
252252
std::vector<ValueDecl*> DeclaredDecls;
253253
std::vector<ReferencedDecl> ReferencedDecls;
254254

255+
/// Collect the type that an ASTNode should be evaluated to.
256+
Type resolveNodeType(ASTNode N) {
257+
if (N.is<Stmt*>()) {
258+
if (auto RS = dyn_cast<ReturnStmt>(N.get<Stmt*>())) {
259+
return resolveNodeType(RS->getResult());
260+
}
261+
// For other statements, the type should be void.
262+
return Ctx.getVoidDecl()->getDeclaredInterfaceType();
263+
} else if (N.is<Expr*>()) {
264+
return N.get<Expr*>()->getType();
265+
}
266+
return Type();
267+
}
268+
255269
ResolvedRangeInfo getSingleNodeKind(ASTNode Node) {
256270
assert(!Node.isNull());
257271
if (Node.is<Expr*>())
258272
return ResolvedRangeInfo(RangeKind::SingleExpression,
259-
Node.get<Expr*>()->getType(), Content,
273+
resolveNodeType(Node), Content,
260274
llvm::makeArrayRef(DeclaredDecls),
261275
llvm::makeArrayRef(ReferencedDecls));
262276
else if (Node.is<Stmt*>())
263-
return ResolvedRangeInfo(RangeKind::SingleStatement, Type(), Content,
264-
DeclaredDecls, ReferencedDecls);
277+
return ResolvedRangeInfo(RangeKind::SingleStatement, resolveNodeType(Node),
278+
Content, llvm::makeArrayRef(DeclaredDecls),
279+
llvm::makeArrayRef(ReferencedDecls));
265280
else {
266281
assert(Node.is<Decl*>());
267282
return ResolvedRangeInfo(RangeKind::SingleDecl, Type(), Content,
268-
DeclaredDecls, ReferencedDecls);
283+
llvm::makeArrayRef(DeclaredDecls),
284+
llvm::makeArrayRef(ReferencedDecls));
269285
}
270286
}
271287

@@ -380,7 +396,9 @@ struct RangeResolver::Implementation {
380396
}
381397

382398
if (!DCInfo.StartMatches.empty() && !DCInfo.EndMatches.empty()) {
383-
Result = {RangeKind::MultiStatement, Type(), Content,
399+
Result = {RangeKind::MultiStatement,
400+
/* Last node has the type */
401+
resolveNodeType(DCInfo.EndMatches.back()), Content,
384402
llvm::makeArrayRef(DeclaredDecls),
385403
llvm::makeArrayRef(ReferencedDecls)};
386404
return;

test/IDE/range_info_basics.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,22 @@ func foo4(s: S1) -> Int {
6767
// CHECK4: <Kind>MultiStatement</Kind>
6868
// CHECK4-NEXT: <Content>aaa = aaa + 3
6969
// CHECK4-NEXT: if aaa == 3 { aaa = 4 }</Content>
70+
// CHECK4-NEXT: <Type>Void</Type>
7071
// CHECK4-NEXT: <Referenced>aaa</Referenced><Type>@lvalue Int</Type>
7172
// CHECK4-NEXT: <end>
7273

7374
// CHECK5: <Kind>MultiStatement</Kind>
7475
// CHECK5-NEXT: <Content>aaa = aaa + 3
7576
// CHECK5-NEXT: if aaa == 3 { aaa = 4 }
7677
// CHECK5-NEXT: return aaa</Content>
78+
// CHECK5-NEXT: <Type>Int</Type>
7779
// CHECK5-NEXT: <Referenced>aaa</Referenced><Type>@lvalue Int</Type>
7880
// CHECK5-NEXT: <end>
7981

8082
// CHECK6: <Kind>MultiStatement</Kind>
8183
// CHECK6-NEXT: if aaa == 3 { aaa = 4 }
8284
// CHECK6-NEXT: return aaa</Content>
85+
// CHECK6-NEXT: <Type>Int</Type>
8386
// CHECK6-NEXT: <Referenced>aaa</Referenced><Type>@lvalue Int</Type>
8487
// CHECK6-NEXT: <end>
8588

@@ -88,6 +91,7 @@ func foo4(s: S1) -> Int {
8891
// CHECK7-NEXT: let c = a.byteSwapped
8992
// CHECK7-NEXT: b = b.bigEndian.bigEndian.byteSwapped
9093
// CHECK7-NEXT: print(b + c)</Content>
94+
// CHECK7-NEXT: <Type>()</Type>
9195
// CHECK7-NEXT: <Declared>b</Declared>
9296
// CHECK7-NEXT: <Declared>c</Declared>
9397
// CHECK7-NEXT: <Referenced>a</Referenced><Type>Int</Type>
@@ -98,6 +102,7 @@ func foo4(s: S1) -> Int {
98102
// CHECK8-NEXT: <Content>let c = s.foo() + b
99103
// CHECK8-NEXT: s = s.increment()
100104
// CHECK8-NEXT: return c + b</Content>
105+
// CHECK8-NEXT: <Type>Int</Type>
101106
// CHECK8-NEXT: <Declared>c</Declared>
102107
// CHECK8-NEXT: <Referenced>s</Referenced><Type>@lvalue S1</Type>
103108
// CHECK8-NEXT: <Referenced>foo</Referenced><Type>(S1) -> () -> Int</Type>
@@ -109,6 +114,7 @@ func foo4(s: S1) -> Int {
109114
// CHECK9-NEXT: <Content>let b = s.a
110115
// CHECK9-NEXT: let c = s.foo() + b
111116
// CHECK9-NEXT: return c + b</Content>
117+
// CHECK9-NEXT: <Type>Int</Type>
112118
// CHECK9-NEXT: <Declared>b</Declared>
113119
// CHECK9-NEXT: <Declared>c</Declared>
114120
// CHECK9-NEXT: <Referenced>s</Referenced><Type>S1</Type>

0 commit comments

Comments
 (0)