@@ -252,20 +252,36 @@ struct RangeResolver::Implementation {
252
252
std::vector<ValueDecl*> DeclaredDecls;
253
253
std::vector<ReferencedDecl> ReferencedDecls;
254
254
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
+
255
269
ResolvedRangeInfo getSingleNodeKind (ASTNode Node) {
256
270
assert (!Node.isNull ());
257
271
if (Node.is <Expr*>())
258
272
return ResolvedRangeInfo (RangeKind::SingleExpression,
259
- Node. get <Expr*>()-> getType ( ), Content,
273
+ resolveNodeType (Node ), Content,
260
274
llvm::makeArrayRef (DeclaredDecls),
261
275
llvm::makeArrayRef (ReferencedDecls));
262
276
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));
265
280
else {
266
281
assert (Node.is <Decl*>());
267
282
return ResolvedRangeInfo (RangeKind::SingleDecl, Type (), Content,
268
- DeclaredDecls, ReferencedDecls);
283
+ llvm::makeArrayRef (DeclaredDecls),
284
+ llvm::makeArrayRef (ReferencedDecls));
269
285
}
270
286
}
271
287
@@ -380,7 +396,9 @@ struct RangeResolver::Implementation {
380
396
}
381
397
382
398
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,
384
402
llvm::makeArrayRef (DeclaredDecls),
385
403
llvm::makeArrayRef (ReferencedDecls)};
386
404
return ;
0 commit comments