From: Ilya Biryukov Date: Tue, 14 Jan 2020 11:34:00 +0000 (+0100) Subject: [Syntax] Unset IsOriginal flag on nodes removed from the tree X-Git-Tag: llvmorg-11-init~112 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=013c07f697886649b068cd97127e528b4fe7c03e;p=platform%2Fupstream%2Fllvm.git [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. --- diff --git a/clang/lib/Tooling/Syntax/Tree.cpp b/clang/lib/Tooling/Syntax/Tree.cpp index 5282857df5a9..9f028c0be3b4 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 Visit) { + if (auto *T = dyn_cast(N)) { + for (auto *C = T->firstChild(); C; C = C->nextSibling()) + traverse(C, Visit); + } + Visit(N); +} +static void traverse(syntax::Node *N, + llvm::function_ref Visit) { + traverse(static_cast(N), [&](const syntax::Node *N) { + Visit(const_cast(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(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 Visit) { - if (auto *T = dyn_cast(N)) { - for (auto *C = T->firstChild(); C; C = C->nextSibling()) - traverse(C, Visit); - } - Visit(N); -} static void dumpTokens(llvm::raw_ostream &OS, ArrayRef Tokens, const SourceManager &SM) { assert(!Tokens.empty()); diff --git a/clang/unittests/Tooling/Syntax/TreeTest.cpp b/clang/unittests/Tooling/Syntax/TreeTest.cpp index c457c7888124..42d77d893536 100644 --- a/clang/unittests/Tooling/Syntax/TreeTest.cpp +++ b/clang/unittests/Tooling/Syntax/TreeTest.cpp @@ -895,6 +895,9 @@ TEST_F(SyntaxTreeTest, Mutations) { auto *S = cast(nodeByRange(Input.range(), TU)); ASSERT_TRUE(S->canModify()) << "cannot remove a statement"; syntax::removeStatement(*Arena, S); + EXPECT_TRUE(S->isDetached()); + EXPECT_FALSE(S->isOriginal()) + << "node removed from tree cannot be marked as original"; }; std::vector>