1//===- BuildTree.h - build syntax trees -----------------------*- C++ -*-=====//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8// Functions to construct a syntax tree from an AST.
9//===----------------------------------------------------------------------===//
10#ifndef LLVM_CLANG_TOOLING_SYNTAX_BUILDTREE_H
11#define LLVM_CLANG_TOOLING_SYNTAX_BUILDTREE_H
12
13#include "clang/AST/Decl.h"
14#include "clang/Basic/TokenKinds.h"
15#include "clang/Tooling/Syntax/Nodes.h"
16#include "clang/Tooling/Syntax/TokenBufferTokenManager.h"
17#include "clang/Tooling/Syntax/Tree.h"
18
19namespace clang {
20namespace syntax {
21
22/// Build a syntax tree for the main file.
23/// This usually covers the whole TranslationUnitDecl, but can be restricted by
24/// the ASTContext's traversal scope.
25syntax::TranslationUnit *
26buildSyntaxTree(Arena &A, TokenBufferTokenManager &TBTM, ASTContext &Context);
27
28// Create syntax trees from subtrees not backed by the source code.
29
30// Synthesis of Leafs
31/// Create `Leaf` from token with `Spelling` and assert it has the desired
32/// `TokenKind`.
33syntax::Leaf *createLeaf(syntax::Arena &A, TokenBufferTokenManager &TBTM,
34 tok::TokenKind K, StringRef Spelling);
35
36/// Infer the token spelling from its `TokenKind`, then create `Leaf` from
37/// this token
38syntax::Leaf *createLeaf(syntax::Arena &A, TokenBufferTokenManager &TBTM,
39 tok::TokenKind K);
40
41// Synthesis of Trees
42/// Creates the concrete syntax node according to the specified `NodeKind` `K`.
43/// Returns it as a pointer to the base class `Tree`.
44syntax::Tree *
45createTree(syntax::Arena &A,
46 ArrayRef<std::pair<syntax::Node *, syntax::NodeRole>> Children,
47 syntax::NodeKind K);
48
49// Synthesis of Syntax Nodes
50syntax::EmptyStatement *createEmptyStatement(syntax::Arena &A,
51 TokenBufferTokenManager &TBTM);
52
53/// Creates a completely independent copy of `N` with its macros expanded.
54///
55/// The copy is:
56/// * Detached, i.e. `Parent == NextSibling == nullptr` and
57/// `Role == Detached`.
58/// * Synthesized, i.e. `Original == false`.
59syntax::Node *deepCopyExpandingMacros(syntax::Arena &A,
60 TokenBufferTokenManager &TBTM,
61 const syntax::Node *N);
62} // namespace syntax
63} // namespace clang
64#endif
65

source code of clang/include/clang/Tooling/Syntax/BuildTree.h