diff options
author | Ilya Biryukov <ibiryukov@google.com> | 2020-01-14 12:34:00 +0100 |
---|---|---|
committer | Ilya Biryukov <ibiryukov@google.com> | 2020-01-14 17:00:33 +0100 |
commit | 013c07f697886649b068cd97127e528b4fe7c03e (patch) | |
tree | 711b34ee759bf96471cca91fd399ef6253bf85ad /clang/lib/Tooling | |
parent | 9ef6faf49670e18eb1ba04105a7c70b450cdaa71 (diff) | |
download | bcm5719-llvm-013c07f697886649b068cd97127e528b4fe7c03e.tar.gz bcm5719-llvm-013c07f697886649b068cd97127e528b4fe7c03e.zip |
[Syntax] Unset IsOriginal flag on nodes removed from the tree
And add a corresponding test.
Only nodes inside the TranslationUnit subtree can be marked as original,
computeReplacements() relies on this.
Diffstat (limited to 'clang/lib/Tooling')
-rw-r--r-- | clang/lib/Tooling/Syntax/Tree.cpp | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/clang/lib/Tooling/Syntax/Tree.cpp b/clang/lib/Tooling/Syntax/Tree.cpp index 5282857df5a..9f028c0be3b 100644 --- a/clang/lib/Tooling/Syntax/Tree.cpp +++ b/clang/lib/Tooling/Syntax/Tree.cpp @@ -15,6 +15,23 @@ using namespace clang; +namespace { +static void traverse(const syntax::Node *N, + llvm::function_ref<void(const syntax::Node *)> Visit) { + if (auto *T = dyn_cast<syntax::Tree>(N)) { + for (auto *C = T->firstChild(); C; C = C->nextSibling()) + traverse(C, Visit); + } + Visit(N); +} +static void traverse(syntax::Node *N, + llvm::function_ref<void(syntax::Node *)> Visit) { + traverse(static_cast<const syntax::Node *>(N), [&](const syntax::Node *N) { + Visit(const_cast<syntax::Node *>(N)); + }); +}; +} // namespace + syntax::Arena::Arena(SourceManager &SourceMgr, const LangOptions &LangOpts, TokenBuffer Tokens) : SourceMgr(SourceMgr), LangOpts(LangOpts), Tokens(std::move(Tokens)) {} @@ -80,6 +97,8 @@ void syntax::Tree::replaceChildRangeLowLevel(Node *BeforeBegin, Node *End, N->Role = static_cast<unsigned>(NodeRole::Detached); N->Parent = nullptr; N->NextSibling = nullptr; + if (N->Original) + traverse(N, [&](Node *C) { C->Original = false; }); N = Next; } @@ -105,14 +124,6 @@ void syntax::Tree::replaceChildRangeLowLevel(Node *BeforeBegin, Node *End, } namespace { -static void traverse(const syntax::Node *N, - llvm::function_ref<void(const syntax::Node *)> Visit) { - if (auto *T = dyn_cast<syntax::Tree>(N)) { - for (auto *C = T->firstChild(); C; C = C->nextSibling()) - traverse(C, Visit); - } - Visit(N); -} static void dumpTokens(llvm::raw_ostream &OS, ArrayRef<syntax::Token> Tokens, const SourceManager &SM) { assert(!Tokens.empty()); |