//===- BuildTree.h - build syntax trees -----------------------*- 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 // //===----------------------------------------------------------------------===// // Functions to construct a syntax tree from an AST. //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_TOOLING_SYNTAX_BUILDTREE_H #define LLVM_CLANG_TOOLING_SYNTAX_BUILDTREE_H #include "clang/AST/Decl.h" #include "clang/Basic/TokenKinds.h" #include "clang/Tooling/Syntax/Nodes.h" #include "clang/Tooling/Syntax/TokenBufferTokenManager.h" #include "clang/Tooling/Syntax/Tree.h" namespace clang { namespace syntax { /// Build a syntax tree for the main file. /// This usually covers the whole TranslationUnitDecl, but can be restricted by /// the ASTContext's traversal scope. syntax::TranslationUnit * buildSyntaxTree(Arena &A, TokenBufferTokenManager &TBTM, ASTContext &Context); // Create syntax trees from subtrees not backed by the source code. // Synthesis of Leafs /// Create `Leaf` from token with `Spelling` and assert it has the desired /// `TokenKind`. syntax::Leaf *createLeaf(syntax::Arena &A, TokenBufferTokenManager &TBTM, tok::TokenKind K, StringRef Spelling); /// Infer the token spelling from its `TokenKind`, then create `Leaf` from /// this token syntax::Leaf *createLeaf(syntax::Arena &A, TokenBufferTokenManager &TBTM, tok::TokenKind K); // Synthesis of Trees /// Creates the concrete syntax node according to the specified `NodeKind` `K`. /// Returns it as a pointer to the base class `Tree`. syntax::Tree * createTree(syntax::Arena &A, ArrayRef<std::pair<syntax::Node *, syntax::NodeRole>> Children, syntax::NodeKind K); // Synthesis of Syntax Nodes syntax::EmptyStatement *createEmptyStatement(syntax::Arena &A, TokenBufferTokenManager &TBTM); /// Creates a completely independent copy of `N` with its macros expanded. /// /// The copy is: /// * Detached, i.e. `Parent == NextSibling == nullptr` and /// `Role == Detached`. /// * Synthesized, i.e. `Original == false`. syntax::Node *deepCopyExpandingMacros(syntax::Arena &A, TokenBufferTokenManager &TBTM, const syntax::Node *N); } // namespace syntax } // namespace clang #endif