Skip to content

Commit 854a8bc

Browse files
committed
[IDE] Allow SourceEntityWalker to keep track of its ASTWalker
This will allow it to be queried for things like the parent ASTNode in the current traversal.
1 parent d7d58cb commit 854a8bc

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

include/swift/IDE/SourceEntityWalker.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#define SWIFT_IDE_SOURCE_ENTITY_WALKER_H
1515

1616
#include "swift/AST/ASTWalker.h"
17+
#include "swift/Basic/Defer.h"
1718
#include "swift/Basic/LLVM.h"
1819
#include "swift/Basic/SourceLoc.h"
1920
#include "llvm/ADT/PointerUnion.h"
@@ -176,6 +177,24 @@ class SourceEntityWalker {
176177
virtual ~SourceEntityWalker() {}
177178

178179
virtual void anchor();
180+
181+
/// Retrieve the current ASTWalker being used to traverse the AST.
182+
const ASTWalker &getWalker() const {
183+
assert(Walker && "Not walking!");
184+
return *Walker;
185+
}
186+
187+
private:
188+
ASTWalker *Walker = nullptr;
189+
190+
/// Utility that lets us keep track of an ASTWalker when walking.
191+
bool performWalk(ASTWalker &W, llvm::function_ref<bool(void)> DoWalk) {
192+
Walker = &W;
193+
SWIFT_DEFER {
194+
Walker = nullptr;
195+
};
196+
return DoWalk();
197+
}
179198
};
180199

181200
} // namespace swift

lib/IDE/SourceEntityWalker.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -806,32 +806,32 @@ bool SemaAnnotator::shouldIgnore(Decl *D) {
806806

807807
bool SourceEntityWalker::walk(SourceFile &SrcFile) {
808808
SemaAnnotator Annotator(*this);
809-
return SrcFile.walk(Annotator);
809+
return performWalk(Annotator, [&]() { return SrcFile.walk(Annotator); });
810810
}
811811

812812
bool SourceEntityWalker::walk(ModuleDecl &Mod) {
813813
SemaAnnotator Annotator(*this);
814-
return Mod.walk(Annotator);
814+
return performWalk(Annotator, [&]() { return Mod.walk(Annotator); });
815815
}
816816

817817
bool SourceEntityWalker::walk(Stmt *S) {
818818
SemaAnnotator Annotator(*this);
819-
return S->walk(Annotator);
819+
return performWalk(Annotator, [&]() { return S->walk(Annotator); });
820820
}
821821

822822
bool SourceEntityWalker::walk(Expr *E) {
823823
SemaAnnotator Annotator(*this);
824-
return E->walk(Annotator);
824+
return performWalk(Annotator, [&]() { return E->walk(Annotator); });
825825
}
826826

827827
bool SourceEntityWalker::walk(Decl *D) {
828828
SemaAnnotator Annotator(*this);
829-
return D->walk(Annotator);
829+
return performWalk(Annotator, [&]() { return D->walk(Annotator); });
830830
}
831831

832832
bool SourceEntityWalker::walk(DeclContext *DC) {
833833
SemaAnnotator Annotator(*this);
834-
return DC->walkContext(Annotator);
834+
return performWalk(Annotator, [&]() { return DC->walkContext(Annotator); });
835835
}
836836

837837
bool SourceEntityWalker::walk(ASTNode N) {

0 commit comments

Comments
 (0)