Skip to content

Commit

Permalink
[Syntax] Unset IsOriginal flag on nodes removed from the tree
Browse files Browse the repository at this point in the history
And add a corresponding test.
Only nodes inside the TranslationUnit subtree can be marked as original,
computeReplacements() relies on this.
  • Loading branch information
ilya-biryukov committed Jan 14, 2020
1 parent 9ef6faf commit 013c07f
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 8 deletions.
27 changes: 19 additions & 8 deletions clang/lib/Tooling/Syntax/Tree.cpp
Expand Up @@ -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)) {}
Expand Down Expand Up @@ -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;
}
Expand All @@ -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());
Expand Down
3 changes: 3 additions & 0 deletions clang/unittests/Tooling/Syntax/TreeTest.cpp
Expand Up @@ -895,6 +895,9 @@ TEST_F(SyntaxTreeTest, Mutations) {
auto *S = cast<syntax::Statement>(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<std::pair<std::string /*Input*/, std::string /*Expected*/>>
Expand Down

0 comments on commit 013c07f

Please sign in to comment.