20#include "llvm/Support/CrashRecoveryContext.h"
21#include "llvm/Support/Error.h"
31 : S(Instance.getSema()) {
32 llvm::ErrorAsOutParameter EAO(&Err);
41IncrementalParser::ParseOrWrapTopLevelDecl() {
43 llvm::CrashRecoveryContextCleanupRegistrar<Sema> CleanupSema(&
S);
49 C.addTranslationUnitDecl();
52 if (
P->getCurToken().is(tok::annot_repl_input_end)) {
65 for (
bool AtEOF =
P->ParseFirstTopLevelDecl(ADecl, ImportState); !AtEOF;
66 AtEOF =
P->ParseTopLevelDecl(ADecl, ImportState)) {
68 return llvm::make_error<llvm::StringError>(
"Parsing failed. "
69 "The consumer rejected a decl",
74 if (Diags.hasErrorOccurred()) {
78 Diags.getClient()->clear();
79 return llvm::make_error<llvm::StringError>(
"Parsing failed.",
89 LocalInstantiations.perform();
90 GlobalInstantiations.perform();
94 return C.getTranslationUnitDecl();
102 std::ostringstream SourceName;
106 size_t InputSize = input.size();
108 std::unique_ptr<llvm::MemoryBuffer> MB(
109 llvm::WritableMemoryBuffer::getNewUninitMemBuffer(InputSize + 1,
111 char *MBStart =
const_cast<char *
>(MB->getBufferStart());
112 memcpy(MBStart, input.data(), InputSize);
113 MBStart[InputSize] =
'\n';
127 return llvm::make_error<llvm::StringError>(
"Parsing failed. "
128 "Cannot enter source file.",
131 auto PTU = ParseOrWrapTopLevelDecl();
133 return PTU.takeError();
143 }
while (Tok.
isNot(tok::annot_repl_input_end));
147 assert(AssertTok.
is(tok::annot_repl_input_end) &&
148 "Lexer must be EOF when starting incremental parse!");
156 for (
auto &&[Key, List] : *Map) {
158 std::vector<NamedDecl *> NamedDeclsToRemove;
159 bool RemoveAll =
true;
161 if (
D->getTranslationUnitDecl() == MostRecentTU)
162 NamedDeclsToRemove.push_back(
D);
166 if (LLVM_LIKELY(RemoveAll)) {
177 auto *ND = dyn_cast<NamedDecl>(
D);
181 if (ND->getDeclName().getFETokenInfo() && !
D->getLangOpts().ObjC &&
182 !
D->getLangOpts().CPlusPlus)
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
virtual void HandleTranslationUnit(ASTContext &Ctx)
HandleTranslationUnit - This method is called when the ASTs for entire translation unit have been par...
virtual bool HandleTopLevelDecl(DeclGroupRef D)
HandleTopLevelDecl - Handle the specified top-level declaration.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
CompilerInstance - Helper class for managing a single instance of the Clang compiler.
The results of name lookup within a DeclContext.
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
StoredDeclsMap * getLookupPtr() const
Retrieve the internal representation of the lookup structure.
Decl - This represents one declaration (or definition), e.g.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
void RemoveDecl(NamedDecl *D)
RemoveDecl - Unlink the decl from its shadowed decl chain.
IncrementalParser(CompilerInstance &Instance, llvm::Error &Err)
virtual ~IncrementalParser()
unsigned InputCount
Counts the number of direct user input lines that have been parsed.
void CleanUpPTU(TranslationUnitDecl *MostRecentTU)
virtual llvm::Expected< TranslationUnitDecl * > Parse(llvm::StringRef Input)
Parses incremental input by creating an in-memory file.
std::unique_ptr< Parser > P
Parser.
ASTConsumer * Consumer
Consumer to process the produced top level decls. Owned by Act.
Sema & S
The Sema performing the incremental compilation.
This represents a decl that may have a name.
Parser - This implements a parser for the C family of languages.
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
bool isIncrementalProcessingEnabled() const
Returns true if incremental processing is enabled.
void Lex(Token &Result)
Lex the next token for this preprocessor.
bool EnterSourceFile(FileID FID, ConstSearchDirIterator Dir, SourceLocation Loc, bool IsFirstIncludeOfFile=true)
Add a source file to the top of the include stack and start lexing tokens from it instead of the curr...
const LangOptions & getLangOpts() const
@ DeclScope
This is a scope that can contain a declaration.
Preprocessor & getPreprocessor() const
void ActOnTranslationUnitScope(Scope *S)
Scope actions.
DiagnosticsEngine & getDiagnostics() const
ASTContext & getASTContext() const
SmallVectorImpl< Decl * > & WeakTopLevelDecls()
WeakTopLevelDeclDecls - access to #pragma weak-generated Decls.
ASTConsumer & getASTConsumer() const
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
SourceManager & getSourceManager() const
ModuleImportState
An enumeration to represent the transition of states in parsing module fragments and imports.
IdentifierResolver IdResolver
Encodes a location in the source.
This class handles loading and caching of source files into memory.
Token - This structure provides full information about a lexed token.
bool is(tok::TokenKind K) const
is/isNot - Predicates to check if this token is a specific kind, as in "if (Tok.is(tok::l_brace)) {....
bool isNot(tok::TokenKind K) const
The top declaration context.
The JSON file list parser is used to communicate input to InstallAPI.