46 #include "llvm/ADT/APFloat.h"
47 #include "llvm/ADT/STLExtras.h"
48 #include "llvm/ADT/SmallString.h"
49 #include "llvm/ADT/StringExtras.h"
50 #include "llvm/Support/Capacity.h"
51 #include "llvm/Support/ConvertUTF.h"
52 #include "llvm/Support/MemoryBuffer.h"
53 #include "llvm/Support/raw_ostream.h"
55 using namespace clang;
57 template class llvm::Registry<clang::PragmaHandler>;
68 : PPOpts(std::move(PPOpts)), Diags(&diags), LangOpts(opts), Target(nullptr),
69 AuxTarget(nullptr), FileMgr(Headers.getFileMgr()), SourceMgr(SM),
70 ScratchBuf(new
ScratchBuffer(SourceMgr)), HeaderInfo(Headers),
71 TheModuleLoader(TheModuleLoader), ExternalSource(nullptr),
72 Identifiers(opts, IILookup),
74 IncrementalProcessing(
false), TUKind(TUKind), CodeComplete(nullptr),
75 CodeCompletionFile(nullptr), CodeCompletionOffset(0),
76 LastTokenWasAt(
false), ModuleImportExpectsIdentifier(
false),
77 CodeCompletionReached(0), MainFileDir(nullptr),
78 SkipMainFilePreamble(0,
true), CurPPLexer(nullptr), CurDirLookup(nullptr),
79 CurLexerKind(CLK_Lexer), CurSubmodule(nullptr), Callbacks(nullptr),
80 CurSubmoduleState(&NullSubmoduleState), MacroArgCache(nullptr),
81 Record(nullptr), MIChainHead(nullptr), DeserialMIChainHead(nullptr) {
82 OwnsHeaderSearch = OwnsHeaders;
87 NumDirectives = NumDefined = NumUndefined = NumPragma = 0;
88 NumIf = NumElse = NumEndif = 0;
89 NumEnteredSourceFiles = 0;
90 NumMacroExpanded = NumFnMacroExpanded = NumBuiltinMacroExpanded = 0;
91 NumFastMacroExpanded = NumTokenPaste = NumFastTokenPaste = 0;
92 MaxIncludeStackDepth = 0;
97 KeepMacroComments =
false;
98 SuppressIncludeNotFoundError =
false;
101 DisableMacroExpansion =
false;
102 MacroExpansionInDirectivesOverride =
false;
104 InMacroArgPreExpansion =
false;
105 NumCachedTokenLexers = 0;
106 PragmasEnabled =
true;
107 ParsingIfOrElifDirective =
false;
108 PreprocessedOutput =
false;
113 ReadMacrosFromExternalSource =
false;
121 RegisterBuiltinPragmas();
124 RegisterBuiltinMacros();
126 if(LangOpts.Borland) {
137 Ident__exception_info = Ident__exception_code =
nullptr;
138 Ident__abnormal_termination = Ident___exception_info =
nullptr;
139 Ident___exception_code = Ident___abnormal_termination =
nullptr;
140 Ident_GetExceptionInfo = Ident_GetExceptionCode =
nullptr;
141 Ident_AbnormalTermination =
nullptr;
146 assert(BacktrackPositions.empty() &&
"EnableBacktrack/Backtrack imbalance!");
148 IncludeMacroStack.clear();
151 while (MacroInfoChain *
I = MIChainHead) {
152 MIChainHead =
I->Next;
153 I->~MacroInfoChain();
159 std::fill(TokenLexerCache, TokenLexerCache + NumCachedTokenLexers,
nullptr);
160 CurTokenLexer.reset();
162 while (DeserializedMacroInfoChain *
I = DeserialMIChainHead) {
163 DeserialMIChainHead =
I->Next;
164 I->~DeserializedMacroInfoChain();
168 for (
MacroArgs *ArgList = MacroArgCache; ArgList;)
169 ArgList = ArgList->deallocate();
172 if (OwnsHeaderSearch)
178 assert((!this->Target || this->Target == &Target) &&
179 "Invalid override of target information");
180 this->Target = &Target;
182 assert((!this->AuxTarget || this->AuxTarget == AuxTarget) &&
183 "Invalid override of aux target information.");
184 this->AuxTarget = AuxTarget;
192 NumEnteredSourceFiles = 0;
195 PragmaHandlersBackup = std::move(PragmaHandlers);
196 PragmaHandlers = llvm::make_unique<PragmaNamespace>(StringRef());
197 RegisterBuiltinPragmas();
200 PredefinesFileID =
FileID();
204 NumEnteredSourceFiles = 1;
206 PragmaHandlers = std::move(PragmaHandlersBackup);
218 if (!DumpFlags)
return;
220 llvm::errs() <<
"\t";
222 llvm::errs() <<
" [StartOfLine]";
224 llvm::errs() <<
" [LeadingSpace]";
226 llvm::errs() <<
" [ExpandDisabled]";
229 llvm::errs() <<
" [UnClean='" << StringRef(Start, Tok.
getLength())
233 llvm::errs() <<
"\tLoc=<";
243 llvm::errs() <<
"MACRO: ";
244 for (
unsigned i = 0, e = MI.
getNumTokens(); i != e; ++i) {
248 llvm::errs() <<
"\n";
252 llvm::errs() <<
"\n*** Preprocessor Stats:\n";
253 llvm::errs() << NumDirectives <<
" directives found:\n";
254 llvm::errs() <<
" " << NumDefined <<
" #define.\n";
255 llvm::errs() <<
" " << NumUndefined <<
" #undef.\n";
256 llvm::errs() <<
" #include/#include_next/#import:\n";
257 llvm::errs() <<
" " << NumEnteredSourceFiles <<
" source files entered.\n";
258 llvm::errs() <<
" " << MaxIncludeStackDepth <<
" max include stack depth\n";
259 llvm::errs() <<
" " << NumIf <<
" #if/#ifndef/#ifdef.\n";
260 llvm::errs() <<
" " << NumElse <<
" #else/#elif.\n";
261 llvm::errs() <<
" " << NumEndif <<
" #endif.\n";
262 llvm::errs() <<
" " << NumPragma <<
" #pragma.\n";
263 llvm::errs() << NumSkipped <<
" #if/#ifndef#ifdef regions skipped\n";
265 llvm::errs() << NumMacroExpanded <<
"/" << NumFnMacroExpanded <<
"/"
266 << NumBuiltinMacroExpanded <<
" obj/fn/builtin macros expanded, "
267 << NumFastMacroExpanded <<
" on the fast path.\n";
268 llvm::errs() << (NumFastTokenPaste+NumTokenPaste)
269 <<
" token paste (##) operations performed, "
270 << NumFastTokenPaste <<
" on the fast path.\n";
272 llvm::errs() <<
"\nPreprocessor Memory: " <<
getTotalMemory() <<
"B total";
274 llvm::errs() <<
"\n BumpPtr: " << BP.getTotalMemory();
275 llvm::errs() <<
"\n Macro Expanded Tokens: "
276 << llvm::capacity_in_bytes(MacroExpandedTokens);
277 llvm::errs() <<
"\n Predefines Buffer: " << Predefines.capacity();
279 llvm::errs() <<
"\n Macros: "
280 << llvm::capacity_in_bytes(CurSubmoduleState->Macros);
281 llvm::errs() <<
"\n #pragma push_macro Info: "
282 << llvm::capacity_in_bytes(PragmaPushMacroInfo);
283 llvm::errs() <<
"\n Poison Reasons: "
284 << llvm::capacity_in_bytes(PoisonReasons);
285 llvm::errs() <<
"\n Comment Handlers: "
286 << llvm::capacity_in_bytes(CommentHandlers) <<
"\n";
291 if (IncludeExternalMacros && ExternalSource &&
292 !ReadMacrosFromExternalSource) {
293 ReadMacrosFromExternalSource =
true;
299 CurSubmoduleState->Macros.insert(std::make_pair(Macro.II, MacroState()));
301 return CurSubmoduleState->Macros.begin();
305 return BP.getTotalMemory()
306 + llvm::capacity_in_bytes(MacroExpandedTokens)
307 + Predefines.capacity()
310 + llvm::capacity_in_bytes(CurSubmoduleState->Macros)
311 + llvm::capacity_in_bytes(PragmaPushMacroInfo)
312 + llvm::capacity_in_bytes(PoisonReasons)
313 + llvm::capacity_in_bytes(CommentHandlers);
318 if (IncludeExternalMacros && ExternalSource &&
319 !ReadMacrosFromExternalSource) {
320 ReadMacrosFromExternalSource =
true;
324 return CurSubmoduleState->Macros.end();
331 std::equal(Tokens.begin(), Tokens.end(), MI->
tokens_begin());
338 StringRef BestSpelling;
342 Def =
I->second.findDirectiveAtLoc(Loc, SourceMgr);
354 BestLocation = Location;
355 BestSpelling =
I->first->getName();
363 CurLexerKind = CLK_Lexer;
364 else if (CurPTHLexer)
365 CurLexerKind = CLK_PTHLexer;
366 else if (CurTokenLexer)
367 CurLexerKind = CLK_TokenLexer;
369 CurLexerKind = CLK_CachingLexer;
373 unsigned CompleteLine,
374 unsigned CompleteColumn) {
376 assert(CompleteLine && CompleteColumn &&
"Starts from 1:1");
377 assert(!CodeCompletionFile &&
"Already set");
379 using llvm::MemoryBuffer;
382 bool Invalid =
false;
388 const char *
Position = Buffer->getBufferStart();
391 if (*Position !=
'\r' && *Position !=
'\n')
395 if ((Position[1] ==
'\r' || Position[1] ==
'\n') &&
396 Position[0] != Position[1])
403 Position += CompleteColumn - 1;
407 if (SkipMainFilePreamble.first &&
409 if (Position - Buffer->getBufferStart() < SkipMainFilePreamble.first)
410 Position = Buffer->getBufferStart() + SkipMainFilePreamble.first;
413 if (Position > Buffer->getBufferEnd())
414 Position = Buffer->getBufferEnd();
416 CodeCompletionFile = File;
417 CodeCompletionOffset = Position - Buffer->getBufferStart();
419 std::unique_ptr<MemoryBuffer> NewBuffer =
420 MemoryBuffer::getNewUninitMemBuffer(Buffer->getBufferSize() + 1,
421 Buffer->getBufferIdentifier());
422 char *NewBuf =
const_cast<char*
>(NewBuffer->getBufferStart());
423 char *NewPos = std::copy(Buffer->getBufferStart(),
Position, NewBuf);
425 std::copy(Position, Buffer->getBufferEnd(), NewPos+1);
442 bool *Invalid)
const {
444 if (Tok.
isNot(tok::raw_identifier) && !Tok.
hasUCN()) {
447 return II->getName();
454 const char *Ptr = Buffer.data();
456 return StringRef(Ptr, Len);
468 SourceLocation Loc = ScratchBuf->getToken(Str.data(), Str.size(), DestPtr);
470 if (ExpansionLocStart.
isValid())
472 ExpansionLocEnd, Str.size());
476 if (Tok.
is(tok::raw_identifier))
500 assert(NumEnteredSourceFiles == 0 &&
"Cannot reenter the main file!");
511 if (SkipMainFilePreamble.first > 0)
512 CurLexer->SkipBytes(SkipMainFilePreamble.first,
513 SkipMainFilePreamble.second);
522 std::unique_ptr<llvm::MemoryBuffer> SB =
523 llvm::MemoryBuffer::getMemBufferCopy(Predefines,
"<built-in>");
524 assert(SB &&
"Cannot create predefined source buffer");
526 assert(FID.
isValid() &&
"Could not create FileID for predefines?");
527 setPredefinesFileID(FID);
536 Callbacks->EndOfMainFile();
547 assert(!Identifier.
getRawIdentifier().empty() &&
"No raw identifier data!");
557 StringRef CleanedStr =
getSpelling(Identifier, IdentifierBuffer);
559 if (Identifier.
hasUCN()) {
570 Identifier.
setKind(II->getTokenID());
576 PoisonReasons[II] = DiagID;
580 assert(Ident__exception_code && Ident__exception_info);
581 assert(Ident___exception_code && Ident___exception_info);
595 "Can't handle identifiers without identifier info!");
596 llvm::DenseMap<IdentifierInfo*,unsigned>::const_iterator it =
598 if(it == PoisonReasons.end())
599 Diag(Identifier, diag::err_pp_used_poisoned_id);
610 if (LangOpts.CPlusPlus)
611 return llvm::StringSwitch<diag::kind>(II.
getName())
613 .Case(#NAME, diag::warn_cxx11_keyword)
614 #include "clang/Basic/TokenKinds.def"
618 "Keyword not known to come from a newer Standard or proposed Standard");
631 "Can't handle identifiers without identifier info!");
640 if (II.isOutOfDate()) {
641 bool CurrentIsPoisoned =
false;
642 if (&II == Ident__VA_ARGS__)
643 CurrentIsPoisoned = Ident__VA_ARGS__->
isPoisoned();
646 Identifier.
setKind(II.getTokenID());
648 if (&II == Ident__VA_ARGS__)
649 II.setIsPoisoned(CurrentIsPoisoned);
654 if (II.isPoisoned() && CurPPLexer) {
660 auto *MI = MD.getMacroInfo();
661 assert(MI &&
"macro definition with no macro info?");
662 if (!DisableMacroExpansion) {
666 if (!MI->isFunctionLike() || isNextPPTokenLParen())
667 return HandleMacroExpandedIdentifier(Identifier, MD);
673 if (MI->isObjectLike() || isNextPPTokenLParen())
674 Diag(Identifier, diag::pp_disabled_macro_expansion);
684 if (II.isFutureCompatKeyword() && !DisableMacroExpansion) {
688 II.setIsFutureCompatKeyword(
false);
694 if (II.isCPlusPlusOperatorKeyword())
701 if (II.isExtensionToken() && !DisableMacroExpansion)
702 Diag(Identifier, diag::ext_token_used);
710 if (LastTokenWasAt && II.isModulesImport() && !InMacroArgs &&
711 !DisableMacroExpansion &&
713 CurLexerKind != CLK_CachingLexer) {
715 ModuleImportPath.clear();
716 ModuleImportExpectsIdentifier =
true;
717 CurLexerKind = CLK_LexAfterModuleImport;
726 switch (CurLexerKind) {
728 ReturnedToken = CurLexer->Lex(Result);
731 ReturnedToken = CurPTHLexer->Lex(Result);
734 ReturnedToken = CurTokenLexer->Lex(Result);
736 case CLK_CachingLexer:
738 ReturnedToken =
true;
740 case CLK_LexAfterModuleImport:
742 ReturnedToken =
true;
745 }
while (!ReturnedToken);
747 LastTokenWasAt = Result.
is(tok::at);
766 if (ModuleImportExpectsIdentifier && Result.
getKind() == tok::identifier) {
771 ModuleImportExpectsIdentifier =
false;
772 CurLexerKind = CLK_LexAfterModuleImport;
778 if (!ModuleImportExpectsIdentifier && Result.
getKind() == tok::period) {
779 ModuleImportExpectsIdentifier =
true;
780 CurLexerKind = CLK_LexAfterModuleImport;
785 if (!ModuleImportPath.empty()) {
786 Module *Imported =
nullptr;
788 Imported = TheModuleLoader.
loadModule(ModuleImportLoc,
796 Callbacks->moduleImport(ModuleImportLoc, ModuleImportPath, Imported);
801 CurSubmoduleState->VisibleModules.setVisible(
806 Diag(ModuleImportLoc, diag::warn_module_conflict)
807 << Path[0]->getFullModuleName()
808 << Conflict->getFullModuleName()
813 if (!BuildingSubmoduleStack.empty() && M != BuildingSubmoduleStack.back().M)
814 BuildingSubmoduleStack.back().M->Imports.insert(M);
818 const char *DiagnosticTag,
819 bool AllowMacroExpansion) {
821 if (Result.
isNot(tok::string_literal)) {
822 Diag(Result, diag::err_expected_string_literal)
823 << 0 << DiagnosticTag;
830 StrToks.push_back(Result);
833 Diag(Result, diag::err_invalid_string_udl);
835 if (AllowMacroExpansion)
839 }
while (Result.
is(tok::string_literal));
843 assert(Literal.
isAscii() &&
"Didn't allow wide strings in");
849 Diag(StrToks[0].getLocation(), diag::err_expected_string_literal)
850 << 0 << DiagnosticTag;
859 assert(Tok.
is(tok::numeric_constant));
861 bool NumberInvalid =
false;
862 StringRef Spelling =
getSpelling(Tok, IntegerBuffer, &NumberInvalid);
866 if (Literal.hadError || !Literal.isIntegerLiteral() || Literal.hasUDSuffix())
868 llvm::APInt APVal(64, 0);
869 if (Literal.GetIntegerValue(APVal))
872 Value = APVal.getLimitedValue();
877 assert(Handler &&
"NULL comment handler");
878 assert(std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler) ==
879 CommentHandlers.end() &&
"Comment handler already registered");
880 CommentHandlers.push_back(Handler);
885 = std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler);
886 assert(Pos != CommentHandlers.end() &&
"Comment handler not registered");
887 CommentHandlers.erase(Pos);
891 bool AnyPendingTokens =
false;
893 HEnd = CommentHandlers.end();
895 if ((*H)->HandleComment(*
this, Comment))
896 AnyPendingTokens =
true;
StringRef getLastMacroWithSpelling(SourceLocation Loc, ArrayRef< TokenValue > Tokens) const
Return the name of the macro defined before Loc that has spelling Tokens.
bool isAtStartOfLine() const
isAtStartOfLine - Return true if this token is at the start of a line.
SourceManager & getSourceManager() const
bool isPoisoned() const
Return true if this token has been poisoned.
void FinalizeForModelFile()
Cleanup after model file parsing.
bool isLoadedFileID(FileID FID) const
Returns true if FID came from a PCH/Module.
Defines the clang::FileManager interface and associated types.
Defines the SourceManager interface.
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
static const Builtin::Info BuiltinInfo[]
Module * getCurrentModule()
Retrieves the module that we're currently building, if any.
Defines the FileSystemStatCache interface.
const char * getCharacterData(SourceLocation SL, bool *Invalid=nullptr) const
Return a pointer to the start of the specified location in the appropriate spelling MemoryBuffer...
void EndSourceFile()
Inform the preprocessor callbacks that processing is complete.
bool isObjectLike() const
virtual void CodeCompleteNaturalLanguage()
Callback invoked when performing code completion in a part of the file where we expect natural langua...
Defines the clang::MacroInfo and clang::MacroDirective classes.
bool hasLeadingSpace() const
Return true if this token has whitespace before it.
A description of the current definition of a macro.
void LexAfterModuleImport(Token &Result)
Lex a token following the 'import' contextual keyword.
std::unique_ptr< llvm::MemoryBuffer > Buffer
bool hasUCN() const
Returns true if this token contains a universal character name.
void setFlag(TokenFlags Flag)
Set the specified flag.
macro_iterator macro_begin(bool IncludeExternalMacros=true) const
bool needsCleaning() const
Return true if this token has trigraphs or escaped newlines in it.
MacroMap::const_iterator macro_iterator
void setCodeCompletionReached()
Note that we hit the code-completion point.
void createPreprocessingRecord()
Create a new preprocessing record, which will keep track of all macro expansions, macro definitions...
bool parseSimpleIntegerLiteral(Token &Tok, uint64_t &Value)
Parses a simple integer literal to get its numeric value.
void setPTHManager(PTHManager *pm)
StringRef getSpelling(SourceLocation loc, SmallVectorImpl< char > &buffer, bool *invalid=nullptr) const
Return the 'spelling' of the token at the given location; does not go up to the spelling location or ...
void DumpToken(const Token &Tok, bool DumpFlags=false) const
Print the token to stderr, used for debugging.
void SetPoisonReason(IdentifierInfo *II, unsigned DiagID)
Specifies the reason for poisoning an identifier.
One of these records is kept for each identifier that is lexed.
Represents a macro directive exported by a module.
void setRawIdentifierData(const char *Ptr)
SourceLocation getLocation() const
virtual ~ExternalPreprocessorSource()
const LangOptions & getLangOpts() const
Token - This structure provides full information about a lexed token.
void setKind(tok::TokenKind K)
void removeCommentHandler(CommentHandler *Handler)
Remove the specified comment handler.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Describes a module or submodule.
bool SetCodeCompletionPoint(const FileEntry *File, unsigned Line, unsigned Column)
Specify the point at which code-completion will be performed.
A record of the steps taken while preprocessing a source file, including the various preprocessing di...
bool getCommentRetentionState() const
void Initialize(const TargetInfo &Target, const TargetInfo *AuxTarget=nullptr)
Initialize the preprocessor using information about the target.
Concrete class used by the front-end to report problems and issues.
HeaderSearch & getHeaderSearchInfo() const
bool isFutureCompatKeyword() const
is/setIsFutureCompatKeyword - Initialize information about whether or not this language token is a ke...
tokens_iterator tokens_begin() const
void dump(const SourceManager &SM) const
tok::TokenKind getKind() const
detail::InMemoryDirectory::const_iterator I
DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) const
Forwarding function for diagnostics.
void LexUnexpandedToken(Token &Result)
Just like Lex, but disables macro expansion of identifier tokens.
void recomputeCurLexerKind()
Recompute the current lexer kind based on the CurLexer/CurPTHLexer/ CurTokenLexer pointers...
StringRef getRawIdentifier() const
getRawIdentifier - For a raw identifier token (i.e., an identifier lexed in raw mode), returns a reference to the text substring in the buffer if known.
const FileEntry * getFileEntryForID(FileID FID) const
Returns the FileEntry record for the provided FileID.
Provides lookups to, and iteration over, IdentiferInfo objects.
Exposes information about the current target.
StringRef getName() const
Return the actual identifier string.
void makeModuleVisible(Module *M, SourceLocation Loc)
bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const
Determines the order of 2 source locations in the translation unit.
FileID createFileID(const FileEntry *SourceFile, SourceLocation IncludePos, SrcMgr::CharacteristicKind FileCharacter, int LoadedID=0, unsigned LoadedOffset=0)
Create a new FileID that represents the specified file being #included from the specified IncludePosi...
virtual void ReadDefinedMacros()=0
Read the set of macros defined by this external macro source.
MacroArgs - An instance of this class captures information about the formal arguments specified to a ...
void EnterMainSourceFile()
Enter the specified FileID as the main source file, which implicitly adds the builtin defines etc...
Defines the clang::Preprocessor interface.
bool hasUDSuffix() const
Return true if this token is a string or character literal which has a ud-suffix. ...
void setIsPoisoned(bool Value=true)
setIsPoisoned - Mark this identifier as poisoned.
static bool MacroDefinitionEquals(const MacroInfo *MI, ArrayRef< TokenValue > Tokens)
Compares macro tokens with a specified token value sequence.
SourceLocation getLocation() const
Return a source location identifier for the specified offset in the current file. ...
bool isNot(tok::TokenKind K) const
unsigned getNumTokens() const
Return the number of tokens that this macro expands to.
SourceLocation createExpansionLoc(SourceLocation Loc, SourceLocation ExpansionLocStart, SourceLocation ExpansionLocEnd, unsigned TokLength, int LoadedID=0, unsigned LoadedOffset=0)
Return a new SourceLocation that encodes the fact that a token from SpellingLoc should actually be re...
Preprocessor(IntrusiveRefCntPtr< PreprocessorOptions > PPOpts, DiagnosticsEngine &diags, LangOptions &opts, SourceManager &SM, HeaderSearch &Headers, ModuleLoader &TheModuleLoader, IdentifierInfoLookup *IILookup=nullptr, bool OwnsHeaderSearch=false, TranslationUnitKind TUKind=TU_Complete)
void overrideFileContents(const FileEntry *SourceFile, llvm::MemoryBuffer *Buffer, bool DoNotFree)
Override the contents of the given source file by providing an already-allocated buffer.
size_t getTotalMemory() const
void addStatCache(std::unique_ptr< FileSystemStatCache > statCache, bool AtBeginning=false)
Installs the provided FileSystemStatCache object within the FileManager.
Encodes a location in the source.
const TemplateArgument * iterator
void setLength(unsigned Len)
StringRef GetString() const
bool isValid() const
Return true if this is a valid SourceLocation object.
MacroDefinition getMacroDefinition(const IdentifierInfo *II)
macro_iterator macro_end(bool IncludeExternalMacros=true) const
All of the names in this module are hidden.
Cached information about one file (either on disk or in the virtual file system). ...
void setIdentifierInfo(IdentifierInfo *II)
void Lex(Token &Result)
Lex the next token for this preprocessor.
llvm::MemoryBuffer * getMemoryBufferForFile(const FileEntry *File, bool *Invalid=nullptr)
Retrieve the memory buffer associated with the given file.
ArrayRef< FormatToken * > Tokens
const Token & getReplacementToken(unsigned Tok) const
FileID getMainFileID() const
Returns the FileID of the main source file.
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)) {...
void expandUCNs(SmallVectorImpl< char > &Buf, StringRef Input)
Copy characters from Input to Buf, expanding any UCNs.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
static diag::kind getFutureCompatDiagKind(const IdentifierInfo &II, const LangOptions &LangOpts)
Returns a diagnostic message kind for reporting a future keyword as appropriate for the identifier an...
void addCommentHandler(CommentHandler *Handler)
Add the specified comment handler to the preprocessor.
MacroInfo * getMacroInfo()
virtual ModuleLoadResult loadModule(SourceLocation ImportLoc, ModuleIdPath Path, Module::NameVisibilityKind Visibility, bool IsInclusionDirective)=0
Attempt to load the given module.
void CodeCompleteNaturalLanguage()
Hook used by the lexer to invoke the "natural language" code completion point.
detail::InMemoryDirectory::const_iterator E
Abstract interface for a module loader.
void PoisonSEHIdentifiers(bool Poison=true)
void setLiteralData(const char *Ptr)
bool isLiteral() const
Return true if this is a "literal", like a numeric constant, string, etc.
Encapsulates the data about a macro definition (e.g.
PragmaNamespace - This PragmaHandler subdivides the namespace of pragmas, allowing hierarchical pragm...
bool HandleIdentifier(Token &Identifier)
Callback invoked when the lexer reads an identifier and has filled in the tokens IdentifierInfo membe...
bool FinishLexStringLiteral(Token &Result, std::string &String, const char *DiagnosticTag, bool AllowMacroExpansion)
Complete the lexing of a string literal where the first token has already been lexed (see LexStringLi...
virtual void updateOutOfDateIdentifier(IdentifierInfo &II)=0
Update an out-of-date identifier.
void CreateString(StringRef Str, Token &Tok, SourceLocation ExpansionLocStart=SourceLocation(), SourceLocation ExpansionLocEnd=SourceLocation())
Plop the specified string into a scratch buffer and set the specified token's location and length to ...
void InitializeForModelFile()
Initialize the preprocessor to parse a model file.
void HandlePoisonedIdentifier(Token &Tok)
Display reason for poisoned identifier.
#define CXX11_KEYWORD(NAME, FLAGS)
bool HandleComment(Token &Token, SourceRange Comment)
void DumpMacro(const MacroInfo &MI) const
TranslationUnitKind
Describes the kind of translation unit being processed.
StringLiteralParser - This decodes string escape characters and performs wide string analysis and Tra...
unsigned kind
All of the diagnostics that can be emitted by the frontend.
const char * getTokenName(TokenKind Kind) LLVM_READNONE
Determines the name of a token as used within the front end.
Defines the clang::TargetInfo interface.
NumericLiteralParser - This performs strict semantic analysis of the content of a ppnumber...
IdentifierInfo * LookUpIdentifierInfo(Token &Identifier) const
Given a tok::raw_identifier token, look up the identifier information for the token and install it in...
unsigned getLength() const
void DumpLocation(SourceLocation Loc) const
void setLocation(SourceLocation L)
A trivial tuple used to represent a source range.
ScratchBuffer - This class exposes a simple interface for the dynamic construction of tokens...
bool isExpandDisabled() const
Return true if this identifier token should never be expanded in the future, due to C99 6...
void addPPCallbacks(std::unique_ptr< PPCallbacks > C)
This class handles loading and caching of source files into memory.
virtual ~CodeCompletionHandler()
bool EnterSourceFile(FileID CurFileID, const DirectoryLookup *Dir, SourceLocation Loc)
Add a source file to the top of the include stack and start lexing tokens from it instead of the curr...
IdentifierInfo * getIdentifierInfo() const