13#ifndef LLVM_CLANG_FRONTEND_ASTUNIT_H
14#define LLVM_CLANG_FRONTEND_ASTUNIT_H
31#include "llvm/ADT/ArrayRef.h"
32#include "llvm/ADT/DenseMap.h"
33#include "llvm/ADT/IntrusiveRefCntPtr.h"
34#include "llvm/ADT/STLExtras.h"
35#include "llvm/ADT/SmallVector.h"
36#include "llvm/ADT/StringMap.h"
37#include "llvm/ADT/StringRef.h"
38#include "llvm/ADT/iterator_range.h"
62class ASTDeserializationListener;
63class ASTMutationListener;
65class CompilerInstance;
66class CompilerInvocation;
73class InMemoryModuleCache;
74class PCHContainerOperations;
75class PCHContainerReader;
77class PreprocessorOptions;
80class SyntaxOnlyAction;
104 std::vector<std::pair<unsigned, unsigned>>
Ranges;
109 std::shared_ptr<LangOptions> LangOpts;
114 std::unique_ptr<HeaderSearch> HeaderInfo;
116 std::shared_ptr<Preprocessor> PP;
118 std::shared_ptr<TargetOptions> TargetOpts;
119 std::shared_ptr<HeaderSearchOptions> HSOpts;
120 std::shared_ptr<PreprocessorOptions> PPOpts;
122 bool HadModuleLoaderFatalFailure =
false;
123 bool StorePreamblesInMemory =
false;
126 std::unique_ptr<ASTWriterData> WriterData;
129 std::string PreambleStoragePath;
133 std::unique_ptr<ASTConsumer> Consumer;
137 std::unique_ptr<Sema> TheSema;
141 std::shared_ptr<CompilerInvocation> Invocation;
149 bool OnlyLocalDecls =
false;
164 bool OwnsRemappedFileBuffers =
true;
173 std::vector<Decl*> TopLevelDecls;
177 using FileDeclsTy = llvm::DenseMap<FileID, std::unique_ptr<LocDeclsTy>>;
181 FileDeclsTy FileDecls;
184 std::string OriginalSourceFile;
202 unsigned NumStoredDiagnosticsFromDriver = 0;
213 unsigned PreambleRebuildCountdown = 0;
216 unsigned PreambleCounter = 0;
224 llvm::StringMap<SourceLocation> PreambleSrcLocCache;
227 std::optional<PrecompiledPreamble> Preamble;
232 std::unique_ptr<llvm::MemoryBuffer> SavedMainFileBuffer;
240 unsigned NumWarningsInPreamble = 0;
244 std::vector<LocalDeclID> TopLevelDeclsInPreamble;
247 bool ShouldCacheCodeCompletionResults : 1;
251 bool IncludeBriefCommentsInCodeCompletion : 1;
255 bool UserFilesAreVolatile : 1;
260 void TranslateStoredDiagnostics(
FileManager &FileMgr,
265 void clearFileLevelDecls();
309 return CachedCompletionTypes;
313 std::shared_ptr<GlobalCodeCompletionAllocator>
315 return CachedCompletionAllocator;
320 CCTUInfo = std::make_unique<CodeCompletionTUInfo>(
321 std::make_shared<GlobalCodeCompletionAllocator>());
327 std::shared_ptr<GlobalCodeCompletionAllocator> CachedCompletionAllocator;
329 std::unique_ptr<CodeCompletionTUInfo> CCTUInfo;
332 std::vector<CachedCodeCompletionResult> CachedCompletionResults;
336 llvm::StringMap<unsigned> CachedCompletionTypes;
343 unsigned CompletionCacheTopLevelHashValue = 0;
350 unsigned PreambleTopLevelHashValue = 0;
354 unsigned CurrentTopLevelHashValue = 0;
358 LLVM_PREFERRED_TYPE(
bool)
359 unsigned UnsafeToFree : 1;
366 void CacheCodeCompletionResults();
369 void ClearCachedCompletionResults();
371 explicit ASTUnit(
bool MainFileIsAST);
373 bool Parse(std::shared_ptr<PCHContainerOperations> PCHContainerOps,
374 std::unique_ptr<llvm::MemoryBuffer> OverrideMainBuffer,
377 std::unique_ptr<llvm::MemoryBuffer> getMainBufferWithPrecompiledPreamble(
378 std::shared_ptr<PCHContainerOperations> PCHContainerOps,
381 unsigned MaxLines = 0);
382 void RealizeTopLevelDeclsFromPreamble();
395 class ConcurrencyState {
405 ConcurrencyState ConcurrencyCheckValue;
415 Self.ConcurrencyCheckValue.start();
419 Self.ConcurrencyCheckValue.finish();
457 bool hasSema()
const {
return (
bool)TheSema; }
460 assert(TheSema &&
"ASTUnit does not have a Sema object!");
465 assert(LangOpts &&
"ASTUnit does not have language options");
470 assert(HSOpts &&
"ASTUnit does not have header search options");
475 assert(PPOpts &&
"ASTUnit does not have preprocessor options");
487 return OriginalSourceFile;
506 assert(!
isMainFileAST() &&
"Invalid call for AST based ASTUnit!");
507 if (!TopLevelDeclsInPreamble.empty())
508 RealizeTopLevelDeclsFromPreamble();
509 return TopLevelDecls.begin();
513 assert(!
isMainFileAST() &&
"Invalid call for AST based ASTUnit!");
514 if (!TopLevelDeclsInPreamble.empty())
515 RealizeTopLevelDeclsFromPreamble();
516 return TopLevelDecls.end();
520 assert(!
isMainFileAST() &&
"Invalid call for AST based ASTUnit!");
521 return TopLevelDeclsInPreamble.size() + TopLevelDecls.size();
525 assert(!
isMainFileAST() &&
"Invalid call for AST based ASTUnit!");
526 return TopLevelDeclsInPreamble.empty() && TopLevelDecls.empty();
531 TopLevelDecls.push_back(
D);
554 unsigned Line,
unsigned Col)
const;
593 return StoredDiagnostics.begin();
597 return StoredDiagnostics.begin();
601 return StoredDiagnostics.end();
605 return StoredDiagnostics.end();
611 if (NumStoredDiagnosticsFromDriver > StoredDiagnostics.size())
612 NumStoredDiagnosticsFromDriver = 0;
613 return StoredDiagnostics.begin() + NumStoredDiagnosticsFromDriver;
617 std::vector<CachedCodeCompletionResult>::iterator;
620 return CachedCompletionResults.begin();
624 return CachedCompletionResults.end();
628 return CachedCompletionResults.size();
634 llvm::iterator_range<PreprocessingRecord::iterator>
654 std::unique_ptr<llvm::MemoryBuffer>
668 static std::unique_ptr<ASTUnit>
669 create(std::shared_ptr<CompilerInvocation> CI,
694 static std::unique_ptr<ASTUnit>
699 std::shared_ptr<HeaderSearchOptions> HSOpts,
700 std::shared_ptr<LangOptions> LangOpts =
nullptr,
701 bool OnlyLocalDecls =
false,
703 bool AllowASTWithCompilerErrors =
false,
704 bool UserFilesAreVolatile =
false,
706 llvm::vfs::getRealFileSystem());
723 bool LoadFromCompilerInvocation(
724 std::shared_ptr<PCHContainerOperations> PCHContainerOps,
725 unsigned PrecompilePreambleAfterNParses,
758 std::shared_ptr<CompilerInvocation> CI,
759 std::shared_ptr<PCHContainerOperations> PCHContainerOps,
762 bool Persistent =
true, StringRef ResourceFilesPath = StringRef(),
763 bool OnlyLocalDecls =
false,
765 unsigned PrecompilePreambleAfterNParses = 0,
766 bool CacheCodeCompletionResults =
false,
767 bool UserFilesAreVolatile =
false,
768 std::unique_ptr<ASTUnit> *ErrAST =
nullptr);
784 static std::unique_ptr<ASTUnit> LoadFromCompilerInvocation(
785 std::shared_ptr<CompilerInvocation> CI,
786 std::shared_ptr<PCHContainerOperations> PCHContainerOps,
788 bool OnlyLocalDecls =
false,
790 unsigned PrecompilePreambleAfterNParses = 0,
792 bool CacheCodeCompletionResults =
false,
793 bool IncludeBriefCommentsInCodeCompletion =
false,
794 bool UserFilesAreVolatile =
false);
833 const char **ArgBegin,
const char **ArgEnd,
834 std::shared_ptr<PCHContainerOperations> PCHContainerOps,
836 bool StorePreamblesInMemory =
false,
837 StringRef PreambleStoragePath = StringRef(),
bool OnlyLocalDecls =
false,
840 bool RemappedFilesKeepOriginalName =
true,
841 unsigned PrecompilePreambleAfterNParses = 0,
843 bool CacheCodeCompletionResults =
false,
844 bool IncludeBriefCommentsInCodeCompletion =
false,
845 bool AllowPCHWithCompilerErrors =
false,
848 bool SingleFileParse =
false,
bool UserFilesAreVolatile =
false,
849 bool ForSerialization =
false,
850 bool RetainExcludedConditionalBlocks =
false,
851 std::optional<StringRef> ModuleFormat = std::nullopt,
852 std::unique_ptr<ASTUnit> *ErrAST =
nullptr,
866 bool Reparse(std::shared_ptr<PCHContainerOperations> PCHContainerOps,
901 bool IncludeCodePatterns,
bool IncludeBriefComments,
903 std::shared_ptr<PCHContainerOperations> PCHContainerOps,
908 std::unique_ptr<SyntaxOnlyAction> Act);
Defines the clang::ASTContext interface.
Defines the Diagnostic-related interfaces.
Defines the clang::FileSystemOptions interface.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Target Target
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
Defines the clang::TargetOptions class.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
ConcurrencyCheck(ASTUnit &Self)
Utility class for loading a ASTContext from an AST file.
const PreprocessorOptions & getPreprocessorOpts() const
unsigned & getCurrentTopLevelHashValue()
Retrieve a reference to the current top-level name hash value.
ASTContext & getASTContext()
CodeCompletionTUInfo & getCodeCompletionTUInfo()
void enableSourceFileDiagnostics()
Enable source-range based diagnostic messages.
stored_diag_iterator stored_diag_end()
void addFileLevelDecl(Decl *D)
Add a new local file-level declaration.
const FileManager & getFileManager() const
static std::unique_ptr< ASTUnit > LoadFromCommandLine(const char **ArgBegin, const char **ArgEnd, std::shared_ptr< PCHContainerOperations > PCHContainerOps, IntrusiveRefCntPtr< DiagnosticsEngine > Diags, StringRef ResourceFilesPath, bool StorePreamblesInMemory=false, StringRef PreambleStoragePath=StringRef(), bool OnlyLocalDecls=false, CaptureDiagsKind CaptureDiagnostics=CaptureDiagsKind::None, ArrayRef< RemappedFile > RemappedFiles=std::nullopt, bool RemappedFilesKeepOriginalName=true, unsigned PrecompilePreambleAfterNParses=0, TranslationUnitKind TUKind=TU_Complete, bool CacheCodeCompletionResults=false, bool IncludeBriefCommentsInCodeCompletion=false, bool AllowPCHWithCompilerErrors=false, SkipFunctionBodiesScope SkipFunctionBodies=SkipFunctionBodiesScope::None, bool SingleFileParse=false, bool UserFilesAreVolatile=false, bool ForSerialization=false, bool RetainExcludedConditionalBlocks=false, std::optional< StringRef > ModuleFormat=std::nullopt, std::unique_ptr< ASTUnit > *ErrAST=nullptr, IntrusiveRefCntPtr< llvm::vfs::FileSystem > VFS=nullptr)
LoadFromCommandLine - Create an ASTUnit from a vector of command line arguments, which must specify e...
void setOwnsRemappedFileBuffers(bool val)
bool isUnsafeToFree() const
void CodeComplete(StringRef File, unsigned Line, unsigned Column, ArrayRef< RemappedFile > RemappedFiles, bool IncludeMacros, bool IncludeCodePatterns, bool IncludeBriefComments, CodeCompleteConsumer &Consumer, std::shared_ptr< PCHContainerOperations > PCHContainerOps, DiagnosticsEngine &Diag, LangOptions &LangOpts, SourceManager &SourceMgr, FileManager &FileMgr, SmallVectorImpl< StoredDiagnostic > &StoredDiagnostics, SmallVectorImpl< const llvm::MemoryBuffer * > &OwnedBuffers, std::unique_ptr< SyntaxOnlyAction > Act)
Perform code completion at the given file, line, and column within this translation unit.
cached_completion_iterator cached_completion_end()
SourceRange mapRangeFromPreamble(SourceRange R) const
bool top_level_empty() const
bool serialize(raw_ostream &OS)
Serialize this translation unit with the given output stream.
bool getOwnsRemappedFileBuffers() const
const FileSystemOptions & getFileSystemOpts() const
ASTDeserializationListener * getDeserializationListener()
stored_diag_const_iterator stored_diag_end() const
bool Reparse(std::shared_ptr< PCHContainerOperations > PCHContainerOps, ArrayRef< RemappedFile > RemappedFiles=std::nullopt, IntrusiveRefCntPtr< llvm::vfs::FileSystem > VFS=nullptr)
Reparse the source files using the same command-line options that were originally used to produce thi...
void setUnsafeToFree(bool Value)
std::unique_ptr< llvm::MemoryBuffer > getBufferForFile(StringRef Filename, std::string *ErrorStr=nullptr)
llvm::StringMap< unsigned > & getCachedCompletionTypes()
Retrieve the mapping from formatted type names to unique type identifiers.
const DiagnosticsEngine & getDiagnostics() const
SourceLocation getLocation(const FileEntry *File, unsigned Line, unsigned Col) const
Get the source location for the given file:line:col triplet.
void ResetForParse()
Free data that will be re-generated on the next parse.
bool getOnlyLocalDecls() const
InputKind getInputKind() const
Determine the input kind this AST unit represents.
OptionalFileEntryRef getPCHFile()
Get the PCH file if one was included.
StringRef getMainFileName() const
ASTUnit(const ASTUnit &)=delete
stored_diag_const_iterator stored_diag_begin() const
SourceLocation mapLocationToPreamble(SourceLocation Loc) const
If Loc is a local location of the main file but inside the preamble chunk, returns the corresponding ...
cached_completion_iterator cached_completion_begin()
const LangOptions & getLangOpts() const
bool isMainFileAST() const
std::vector< Decl * >::iterator top_level_iterator
const SourceManager & getSourceManager() const
ASTUnit & operator=(const ASTUnit &)=delete
unsigned stored_diag_size() const
Preprocessor & getPreprocessor()
DiagnosticsEngine & getDiagnostics()
SourceLocation getEndOfPreambleFileID() const
stored_diag_iterator stored_diag_afterDriver_begin()
@ LoadPreprocessorOnly
Load options and the preprocessor state.
@ LoadASTOnly
Load the AST, but do not restore Sema state.
@ LoadEverything
Load everything, including Sema.
top_level_iterator top_level_end()
SourceLocation getStartOfMainFileID() const
SourceRange mapRangeToPreamble(SourceRange R) const
FileManager & getFileManager()
IntrusiveRefCntPtr< ASTReader > getASTReader() const
bool(*)(void *context, const Decl *D) DeclVisitorFn
Type for a function iterating over a number of declarations.
bool visitLocalTopLevelDecls(void *context, DeclVisitorFn Fn)
Iterate over local declarations (locally parsed if this is a parsed source file or the loaded declara...
llvm::iterator_range< PreprocessingRecord::iterator > getLocalPreprocessingEntities() const
Returns an iterator range for the local preprocessing entities of the local Preprocessor,...
StringRef getOriginalSourceFileName() const
top_level_iterator top_level_begin()
std::vector< CachedCodeCompletionResult >::iterator cached_completion_iterator
ASTMutationListener * getASTMutationListener()
stored_diag_iterator stored_diag_begin()
TranslationUnitKind getTranslationUnitKind() const
Determine what kind of translation unit this AST represents.
std::shared_ptr< Preprocessor > getPreprocessorPtr() const
void setPreprocessor(std::shared_ptr< Preprocessor > pp)
void setASTContext(ASTContext *ctx)
StringRef getASTFileName() const
If this ASTUnit came from an AST file, returns the filename for it.
bool Save(StringRef File)
Save this translation unit to a file with the given name.
static std::unique_ptr< ASTUnit > create(std::shared_ptr< CompilerInvocation > CI, IntrusiveRefCntPtr< DiagnosticsEngine > Diags, CaptureDiagsKind CaptureDiagnostics, bool UserFilesAreVolatile)
Create a ASTUnit. Gets ownership of the passed CompilerInvocation.
SourceManager & getSourceManager()
const HeaderSearchOptions & getHeaderSearchOpts() const
unsigned getPreambleCounterForTests() const
unsigned cached_completion_size() const
void addTopLevelDecl(Decl *D)
Add a new top-level declaration.
const Preprocessor & getPreprocessor() const
std::shared_ptr< GlobalCodeCompletionAllocator > getCachedCompletionAllocator()
Retrieve the allocator used to cache global code completions.
static ASTUnit * LoadFromCompilerInvocationAction(std::shared_ptr< CompilerInvocation > CI, std::shared_ptr< PCHContainerOperations > PCHContainerOps, IntrusiveRefCntPtr< DiagnosticsEngine > Diags, FrontendAction *Action=nullptr, ASTUnit *Unit=nullptr, bool Persistent=true, StringRef ResourceFilesPath=StringRef(), bool OnlyLocalDecls=false, CaptureDiagsKind CaptureDiagnostics=CaptureDiagsKind::None, unsigned PrecompilePreambleAfterNParses=0, bool CacheCodeCompletionResults=false, bool UserFilesAreVolatile=false, std::unique_ptr< ASTUnit > *ErrAST=nullptr)
Create an ASTUnit from a source file, via a CompilerInvocation object, by invoking the optionally pro...
bool isInMainFileID(SourceLocation Loc) const
bool isModuleFile() const
Returns true if the ASTUnit was constructed from a serialized module file.
void findFileRegionDecls(FileID File, unsigned Offset, unsigned Length, SmallVectorImpl< Decl * > &Decls)
Get the decls that are contained in a file in the Offset/Length range.
const ASTContext & getASTContext() const
bool isInPreambleFileID(SourceLocation Loc) const
SourceLocation mapLocationFromPreamble(SourceLocation Loc) const
If Loc is a loaded location from the preamble, returns the corresponding local location of the main f...
std::pair< std::string, llvm::MemoryBuffer * > RemappedFile
A mapping from a file name to the memory buffer that stores the remapped contents of that file.
std::size_t top_level_size() const
static std::unique_ptr< ASTUnit > LoadFromASTFile(const std::string &Filename, const PCHContainerReader &PCHContainerRdr, WhatToLoad ToLoad, IntrusiveRefCntPtr< DiagnosticsEngine > Diags, const FileSystemOptions &FileSystemOpts, std::shared_ptr< HeaderSearchOptions > HSOpts, std::shared_ptr< LangOptions > LangOpts=nullptr, bool OnlyLocalDecls=false, CaptureDiagsKind CaptureDiagnostics=CaptureDiagsKind::None, bool AllowASTWithCompilerErrors=false, bool UserFilesAreVolatile=false, IntrusiveRefCntPtr< llvm::vfs::FileSystem > VFS=llvm::vfs::getRealFileSystem())
Create a ASTUnit from an AST file.
Abstract interface for a consumer of code-completion information.
A "string" used to describe how code completion can be performed for an entity.
CompilerInstance - Helper class for managing a single instance of the Clang compiler.
Helper class for holding the data necessary to invoke the compiler.
Decl - This represents one declaration (or definition), e.g.
Concrete class used by the front-end to report problems and issues.
Level
The level of the diagnostic, after it has been through mapping.
Cached information about one file (either on disk or in the virtual file system).
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Implements support for file system lookup, file system caching, and directory search management.
Keeps track of options that affect how file operations are performed.
Abstract base class for actions which can be performed by the frontend.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Abstract interface for a module loader.
This abstract interface provides operations for unwrapping containers for serialized ASTs (precompile...
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Sema - This implements semantic analysis and AST building for C.
Encodes a location in the source.
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
Represents a diagnostic in a form that can be retained until its corresponding source manager is dest...
A module loader that doesn't know how to create or load modules.
CXCursorKind
Describes the kind of entity that a cursor refers to.
CXAvailabilityKind
Describes the availability of a particular entity, which indicates whether the use of this entity wil...
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
The JSON file list parser is used to communicate input to InstallAPI.
SkipFunctionBodiesScope
Enumerates the available scopes for skipping function bodies.
SimplifiedTypeClass
A simplified classification of types used when determining "similar" types for code completion.
CaptureDiagsKind
Enumerates the available kinds for capturing diagnostics.
@ AllWithoutNonErrorsFromIncludes
TranslationUnitKind
Describes the kind of translation unit being processed.
@ TU_Complete
The translation unit is a complete translation unit.
@ None
The alignment was not explicit in code.
Diagnostic wrappers for TextAPI types for error reporting.
A cached code-completion result, which may be introduced in one of many different contexts.
unsigned Type
The type of a non-macro completion result, stored as a unique integer used by the string map of cache...
CXCursorKind Kind
The libclang cursor kind corresponding to this code-completion result.
CXAvailabilityKind Availability
The availability of this code-completion result.
unsigned Priority
The priority given to this code-completion result.
SimplifiedTypeClass TypeClass
The simplified type class for a non-macro completion result.
uint64_t ShowInContexts
A bitmask that indicates which code-completion contexts should contain this completion result.
CodeCompletionString * Completion
The code-completion string corresponding to this completion result.
DiagnosticsEngine::Level Level
std::vector< std::pair< unsigned, unsigned > > Ranges
std::vector< StandaloneFixIt > FixIts
std::pair< unsigned, unsigned > InsertFromRange
std::pair< unsigned, unsigned > RemoveRange
bool BeforePreviousInsertions