//===- ExternalASTSource.h - Abstract External AST Interface ----*- 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 // //===----------------------------------------------------------------------===// // // This file defines the ExternalASTSource interface, which enables // construction of AST nodes from some external source. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_AST_EXTERNALASTSOURCE_H #define LLVM_CLANG_AST_EXTERNALASTSOURCE_H #include "clang/AST/CharUnits.h" #include "clang/AST/DeclBase.h" #include "clang/Basic/LLVM.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/IntrusiveRefCntPtr.h" #include "llvm/ADT/PointerUnion.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/iterator.h" #include "llvm/Support/PointerLikeTypeTraits.h" #include <cassert> #include <cstddef> #include <cstdint> #include <iterator> #include <optional> #include <utility> namespace clang { class ASTConsumer; class ASTContext; class ASTSourceDescriptor; class CXXBaseSpecifier; class CXXCtorInitializer; class CXXRecordDecl; class DeclarationName; class FieldDecl; class IdentifierInfo; class NamedDecl; class ObjCInterfaceDecl; class RecordDecl; class Selector; class Stmt; class TagDecl; /// Abstract interface for external sources of AST nodes. /// /// External AST sources provide AST nodes constructed from some /// external source, such as a precompiled header. External AST /// sources can resolve types and declarations from abstract IDs into /// actual type and declaration nodes, and read parts of declaration /// contexts. class ExternalASTSource : public RefCountedBase<ExternalASTSource> { … }; /// A lazy pointer to an AST node (of base type T) that resides /// within an external AST source. /// /// The AST node is identified within the external AST source by a /// 63-bit offset, and can be retrieved via an operation on the /// external AST source itself. template<typename T, typename OffsT, T* (ExternalASTSource::*Get)(OffsT Offset)> struct LazyOffsetPtr { … }; /// A lazy value (of type T) that is within an AST node of type Owner, /// where the value might change in later generations of the external AST /// source. template<typename Owner, typename T, void (ExternalASTSource::*Update)(Owner)> struct LazyGenerationalUpdatePtr { … }; } // namespace clang namespace llvm { /// Specialize PointerLikeTypeTraits to allow LazyGenerationalUpdatePtr to be /// placed into a PointerUnion. PointerLikeTypeTraits<clang::LazyGenerationalUpdatePtr<Owner, T, Update>>; } // namespace llvm namespace clang { /// Represents a lazily-loaded vector of data. /// /// The lazily-loaded vector of data contains data that is partially loaded /// from an external source and partially added by local translation. The /// items loaded from the external source are loaded lazily, when needed for /// iteration over the complete vector. template<typename T, typename Source, void (Source::*Loader)(SmallVectorImpl<T>&), unsigned LoadedStorage = 2, unsigned LocalStorage = 4> class LazyVector { … }; /// A lazy pointer to a statement. LazyDeclStmtPtr; /// A lazy pointer to a declaration. LazyDeclPtr; /// A lazy pointer to a set of CXXCtorInitializers. LazyCXXCtorInitializersPtr; /// A lazy pointer to a set of CXXBaseSpecifiers. LazyCXXBaseSpecifiersPtr; } // namespace clang #endif // LLVM_CLANG_AST_EXTERNALASTSOURCE_H