forked from OSchip/llvm-project
46 lines
1.7 KiB
C++
46 lines
1.7 KiB
C++
//===- 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;
|
|
}
|