mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
[RangeInfo] Report the innermost decl context for the range under selection. (#6448)
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user