[RangeInfo] Report the innermost decl context for the range under selection. (#6448)

This commit is contained in:
Xi Ge
2016-12-21 16:50:39 -08:00
committed by GitHub
parent 5cff812195
commit 94851e25d7
7 changed files with 148 additions and 4 deletions

View File

@@ -206,6 +206,11 @@ void ResolvedRangeInfo::print(llvm::raw_ostream &OS) {
Ty->print(OS);
OS << "</Type>\n";
}
OS << "<Context>";
printContext(OS, RangeContext);
OS << "</Context>\n";
for (auto *VD : DeclaredDecls) {
OS << "<Declared>" << VD->getNameStr() << "</Declared>\n";
}
@@ -273,15 +278,18 @@ private:
if (Node.is<Expr*>())
return ResolvedRangeInfo(RangeKind::SingleExpression,
resolveNodeType(Node), Content,
getImmediateContext(),
llvm::makeArrayRef(DeclaredDecls),
llvm::makeArrayRef(ReferencedDecls));
else if (Node.is<Stmt*>())
return ResolvedRangeInfo(RangeKind::SingleStatement, resolveNodeType(Node),
Content, llvm::makeArrayRef(DeclaredDecls),
Content, getImmediateContext(),
llvm::makeArrayRef(DeclaredDecls),
llvm::makeArrayRef(ReferencedDecls));
else {
assert(Node.is<Decl*>());
return ResolvedRangeInfo(RangeKind::SingleDecl, Type(), Content,
getImmediateContext(),
llvm::makeArrayRef(DeclaredDecls),
llvm::makeArrayRef(ReferencedDecls));
}
@@ -332,6 +340,14 @@ private:
return SourceLoc();
}
DeclContext *getImmediateContext() {
for (auto It = ContextStack.rbegin(); It != ContextStack.rend(); It ++) {
if (auto *DC = It->Parent.getAsDeclContext())
return DC;
}
return static_cast<DeclContext*>(&File);
}
Implementation(SourceFile &File, SourceLoc Start, SourceLoc End) :
File(File), Ctx(File.getASTContext()), SM(Ctx.SourceMgr), Start(Start),
End(End), Content(getContent()) {}
@@ -401,6 +417,7 @@ public:
Result = {RangeKind::MultiStatement,
/* Last node has the type */
resolveNodeType(DCInfo.EndMatches.back()), Content,
getImmediateContext(),
llvm::makeArrayRef(DeclaredDecls),
llvm::makeArrayRef(ReferencedDecls)};
return;