[Syntax] Mark synthesized nodes as modifiable
authorIlya Biryukov <ibiryukov@google.com>
Tue, 14 Jan 2020 15:27:06 +0000 (16:27 +0100)
committerIlya Biryukov <ibiryukov@google.com>
Tue, 14 Jan 2020 15:41:09 +0000 (16:41 +0100)
This was an oversight in the original patch.
Also add corresponding tests.

clang/include/clang/Tooling/Syntax/Tree.h
clang/lib/Tooling/Syntax/Synthesis.cpp
clang/unittests/Tooling/Syntax/TreeTest.cpp

index 640697a25f3d8c94f5f03c0a22a063df8a3e9c06..8702fe60ce1b2e2180e8ff32048035adb6ff6959 100644 (file)
@@ -123,6 +123,8 @@ private:
   friend class TreeBuilder;
   // MutationsImpl sets roles and CanModify flag.
   friend class MutationsImpl;
+  // FactoryImpl sets CanModify flag.
+  friend class FactoryImpl;
 
   Tree *Parent;
   Node *NextSibling;
index cbd9579f4f06e0beb42393735b0995ebf481b8f0..aa01a34c761fd85f49484d967b8d6d7543c4ec40 100644 (file)
@@ -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();
index b54d06319e8354fd7c3e40359ef8cf29fdadf67b..c457c78881241c93a49f719db6463960f60313d0 100644 (file)
@@ -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