@@ -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 ;
0 commit comments