//===- Synthesis.cpp ------------------------------------------*- C++ -*-=====// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "clang/Tooling/Syntax/BuildTree.h" using namespace clang; /// Exposes private syntax tree APIs required to implement node synthesis. /// 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); } }; clang::syntax::Leaf *syntax::createPunctuation(clang::syntax::Arena &A, clang::tok::TokenKind K) { auto Tokens = A.lexBuffer(llvm::MemoryBuffer::getMemBuffer( clang::tok::getPunctuatorSpelling(K))) .second; 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; } 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(); return S; }