summaryrefslogtreecommitdiffstats
path: root/clang/lib/Tooling
diff options
context:
space:
mode:
authorIlya Biryukov <ibiryukov@google.com>2020-01-14 12:34:00 +0100
committerIlya Biryukov <ibiryukov@google.com>2020-01-14 17:00:33 +0100
commit013c07f697886649b068cd97127e528b4fe7c03e (patch)
tree711b34ee759bf96471cca91fd399ef6253bf85ad /clang/lib/Tooling
parent9ef6faf49670e18eb1ba04105a7c70b450cdaa71 (diff)
downloadbcm5719-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.cpp27
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());
OpenPOWER on IntegriCloud