[clang] 07a4101 - [Syntax] Mark synthesized nodes as modifiable
Ilya Biryukov via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 14 07:41:40 PST 2020
Author: Ilya Biryukov
Date: 2020-01-14T16:41:09+01:00
New Revision: 07a41018e9d27f67f7b4295eb7e00e0345c0aacf
URL: https://github.com/llvm/llvm-project/commit/07a41018e9d27f67f7b4295eb7e00e0345c0aacf
DIFF: https://github.com/llvm/llvm-project/commit/07a41018e9d27f67f7b4295eb7e00e0345c0aacf.diff
LOG: [Syntax] Mark synthesized nodes as modifiable
This was an oversight in the original patch.
Also add corresponding tests.
Added:
Modified:
clang/include/clang/Tooling/Syntax/Tree.h
clang/lib/Tooling/Syntax/Synthesis.cpp
clang/unittests/Tooling/Syntax/TreeTest.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Tooling/Syntax/Tree.h b/clang/include/clang/Tooling/Syntax/Tree.h
index 640697a25f3d..8702fe60ce1b 100644
--- a/clang/include/clang/Tooling/Syntax/Tree.h
+++ b/clang/include/clang/Tooling/Syntax/Tree.h
@@ -123,6 +123,8 @@ class Node {
friend class TreeBuilder;
// MutationsImpl sets roles and CanModify flag.
friend class MutationsImpl;
+ // FactoryImpl sets CanModify flag.
+ friend class FactoryImpl;
Tree *Parent;
Node *NextSibling;
diff --git a/clang/lib/Tooling/Syntax/Synthesis.cpp b/clang/lib/Tooling/Syntax/Synthesis.cpp
index cbd9579f4f06..aa01a34c761f 100644
--- a/clang/lib/Tooling/Syntax/Synthesis.cpp
+++ b/clang/lib/Tooling/Syntax/Synthesis.cpp
@@ -13,6 +13,8 @@ using namespace clang;
/// Should not be used for anything else.
class syntax::FactoryImpl {
public:
+ static void setCanModify(syntax::Node *N) { N->CanModify = true; }
+
static void prependChildLowLevel(syntax::Tree *T, syntax::Node *Child,
syntax::NodeRole R) {
T->prependChildLowLevel(Child, R);
@@ -27,6 +29,7 @@ clang::syntax::Leaf *syntax::createPunctuation(clang::syntax::Arena &A,
assert(Tokens.size() == 1);
assert(Tokens.front().kind() == K);
auto *L = new (A.allocator()) clang::syntax::Leaf(Tokens.begin());
+ FactoryImpl::setCanModify(L);
L->assertInvariants();
return L;
}
@@ -34,6 +37,7 @@ clang::syntax::Leaf *syntax::createPunctuation(clang::syntax::Arena &A,
clang::syntax::EmptyStatement *
syntax::createEmptyStatement(clang::syntax::Arena &A) {
auto *S = new (A.allocator()) clang::syntax::EmptyStatement;
+ FactoryImpl::setCanModify(S);
FactoryImpl::prependChildLowLevel(S, createPunctuation(A, clang::tok::semi),
NodeRole::Unknown);
S->assertInvariants();
diff --git a/clang/unittests/Tooling/Syntax/TreeTest.cpp b/clang/unittests/Tooling/Syntax/TreeTest.cpp
index b54d06319e83..c457c7888124 100644
--- a/clang/unittests/Tooling/Syntax/TreeTest.cpp
+++ b/clang/unittests/Tooling/Syntax/TreeTest.cpp
@@ -11,6 +11,7 @@
#include "clang/AST/Decl.h"
#include "clang/AST/Stmt.h"
#include "clang/Basic/LLVM.h"
+#include "clang/Basic/TokenKinds.h"
#include "clang/Frontend/CompilerInstance.h"
#include "clang/Frontend/CompilerInvocation.h"
#include "clang/Frontend/FrontendAction.h"
@@ -906,4 +907,21 @@ TEST_F(SyntaxTreeTest, Mutations) {
CheckTransformation(C.first, C.second, RemoveStatement);
}
+TEST_F(SyntaxTreeTest, SynthesizedNodes) {
+ buildTree("");
+
+ auto *C = syntax::createPunctuation(*Arena, tok::comma);
+ ASSERT_NE(C, nullptr);
+ EXPECT_EQ(C->token()->kind(), tok::comma);
+ EXPECT_TRUE(C->canModify());
+ EXPECT_FALSE(C->isOriginal());
+ EXPECT_TRUE(C->isDetached());
+
+ auto *S = syntax::createEmptyStatement(*Arena);
+ ASSERT_NE(S, nullptr);
+ EXPECT_TRUE(S->canModify());
+ EXPECT_FALSE(S->isOriginal());
+ EXPECT_TRUE(S->isDetached());
+}
+
} // namespace
More information about the cfe-commits
mailing list