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"
54 using namespace clang;
65 : PPOpts(PPOpts), Diags(&diags), LangOpts(opts), Target(nullptr),
66 AuxTarget(nullptr), FileMgr(Headers.getFileMgr()),
SourceMgr(SM),
68 TheModuleLoader(TheModuleLoader), ExternalSource(nullptr),
69 Identifiers(opts, IILookup),
71 IncrementalProcessing(
false), TUKind(TUKind), CodeComplete(nullptr),
72 CodeCompletionFile(nullptr), CodeCompletionOffset(0),
73 LastTokenWasAt(
false), ModuleImportExpectsIdentifier(
false),
74 CodeCompletionReached(0), MainFileDir(nullptr),
75 SkipMainFilePreamble(0,
true), CurPPLexer(nullptr), CurDirLookup(nullptr),
76 CurLexerKind(CLK_Lexer), CurSubmodule(nullptr), Callbacks(nullptr),
77 CurSubmoduleState(&NullSubmoduleState), MacroArgCache(nullptr),
78 Record(nullptr), MIChainHead(nullptr), DeserialMIChainHead(nullptr) {
79 OwnsHeaderSearch = OwnsHeaders;
84 NumDirectives = NumDefined = NumUndefined = NumPragma = 0;
85 NumIf = NumElse = NumEndif = 0;
86 NumEnteredSourceFiles = 0;
87 NumMacroExpanded = NumFnMacroExpanded = NumBuiltinMacroExpanded = 0;
88 NumFastMacroExpanded = NumTokenPaste = NumFastTokenPaste = 0;
89 MaxIncludeStackDepth = 0;
94 KeepMacroComments =
false;
95 SuppressIncludeNotFoundError =
false;
98 DisableMacroExpansion =
false;
99 MacroExpansionInDirectivesOverride =
false;
101 InMacroArgPreExpansion =
false;
102 NumCachedTokenLexers = 0;
103 PragmasEnabled =
true;
104 ParsingIfOrElifDirective =
false;
105 PreprocessedOutput =
false;
110 ReadMacrosFromExternalSource =
false;
118 RegisterBuiltinPragmas();
121 RegisterBuiltinMacros();
123 if(LangOpts.Borland) {
134 Ident__exception_info = Ident__exception_code =
nullptr;
135 Ident__abnormal_termination = Ident___exception_info =
nullptr;
136 Ident___exception_code = Ident___abnormal_termination =
nullptr;
137 Ident_GetExceptionInfo = Ident_GetExceptionCode =
nullptr;
138 Ident_AbnormalTermination =
nullptr;
143 assert(BacktrackPositions.empty() &&
"EnableBacktrack/Backtrack imbalance!");
145 IncludeMacroStack.clear();
148 while (MacroInfoChain *
I = MIChainHead) {
149 MIChainHead =
I->Next;
150 I->~MacroInfoChain();
156 std::fill(TokenLexerCache, TokenLexerCache + NumCachedTokenLexers,
nullptr);
157 CurTokenLexer.reset();
159 while (DeserializedMacroInfoChain *
I = DeserialMIChainHead) {
160 DeserialMIChainHead =
I->Next;
161 I->~DeserializedMacroInfoChain();
165 for (
MacroArgs *ArgList = MacroArgCache; ArgList;)
166 ArgList = ArgList->deallocate();
169 if (OwnsHeaderSearch)
175 assert((!this->Target || this->Target == &Target) &&
176 "Invalid override of target information");
177 this->Target = &Target;
179 assert((!this->AuxTarget || this->AuxTarget == AuxTarget) &&
180 "Invalid override of aux target information.");
181 this->AuxTarget = AuxTarget;
189 NumEnteredSourceFiles = 0;
192 PragmaHandlersBackup = std::move(PragmaHandlers);
193 PragmaHandlers = llvm::make_unique<PragmaNamespace>(StringRef());
194 RegisterBuiltinPragmas();
197 PredefinesFileID =
FileID();
201 NumEnteredSourceFiles = 1;
203 PragmaHandlers = std::move(PragmaHandlersBackup);
215 if (!DumpFlags)
return;
217 llvm::errs() <<
"\t";
219 llvm::errs() <<
" [StartOfLine]";
221 llvm::errs() <<
" [LeadingSpace]";
223 llvm::errs() <<
" [ExpandDisabled]";
226 llvm::errs() <<
" [UnClean='" << StringRef(Start, Tok.
getLength())
230 llvm::errs() <<
"\tLoc=<";
240 llvm::errs() <<
"MACRO: ";
241 for (
unsigned i = 0, e = MI.
getNumTokens(); i != e; ++i) {
245 llvm::errs() <<
"\n";
249 llvm::errs() <<
"\n*** Preprocessor Stats:\n";
250 llvm::errs() << NumDirectives <<
" directives found:\n";
251 llvm::errs() <<
" " << NumDefined <<
" #define.\n";
252 llvm::errs() <<
" " << NumUndefined <<
" #undef.\n";
253 llvm::errs() <<
" #include/#include_next/#import:\n";
254 llvm::errs() <<
" " << NumEnteredSourceFiles <<
" source files entered.\n";
255 llvm::errs() <<
" " << MaxIncludeStackDepth <<
" max include stack depth\n";
256 llvm::errs() <<
" " << NumIf <<
" #if/#ifndef/#ifdef.\n";
257 llvm::errs() <<
" " << NumElse <<
" #else/#elif.\n";
258 llvm::errs() <<
" " << NumEndif <<
" #endif.\n";
259 llvm::errs() <<
" " << NumPragma <<
" #pragma.\n";
260 llvm::errs() << NumSkipped <<
" #if/#ifndef#ifdef regions skipped\n";
262 llvm::errs() << NumMacroExpanded <<
"/" << NumFnMacroExpanded <<
"/"
263 << NumBuiltinMacroExpanded <<
" obj/fn/builtin macros expanded, "
264 << NumFastMacroExpanded <<
" on the fast path.\n";
265 llvm::errs() << (NumFastTokenPaste+NumTokenPaste)
266 <<
" token paste (##) operations performed, "
267 << NumFastTokenPaste <<
" on the fast path.\n";
269 llvm::errs() <<
"\nPreprocessor Memory: " <<
getTotalMemory() <<
"B total";
271 llvm::errs() <<
"\n BumpPtr: " << BP.getTotalMemory();
272 llvm::errs() <<
"\n Macro Expanded Tokens: "
273 << llvm::capacity_in_bytes(MacroExpandedTokens);
274 llvm::errs() <<
"\n Predefines Buffer: " << Predefines.capacity();
276 llvm::errs() <<
"\n Macros: "
277 << llvm::capacity_in_bytes(CurSubmoduleState->Macros);
278 llvm::errs() <<
"\n #pragma push_macro Info: "
279 << llvm::capacity_in_bytes(PragmaPushMacroInfo);
280 llvm::errs() <<
"\n Poison Reasons: "
281 << llvm::capacity_in_bytes(PoisonReasons);
282 llvm::errs() <<
"\n Comment Handlers: "
283 << llvm::capacity_in_bytes(CommentHandlers) <<
"\n";
288 if (IncludeExternalMacros && ExternalSource &&
289 !ReadMacrosFromExternalSource) {
290 ReadMacrosFromExternalSource =
true;
296 CurSubmoduleState->Macros.insert(std::make_pair(Macro.II, MacroState()));
298 return CurSubmoduleState->Macros.begin();
302 return BP.getTotalMemory()
303 + llvm::capacity_in_bytes(MacroExpandedTokens)
304 + Predefines.capacity()
307 + llvm::capacity_in_bytes(CurSubmoduleState->Macros)
308 + llvm::capacity_in_bytes(PragmaPushMacroInfo)
309 + llvm::capacity_in_bytes(PoisonReasons)
310 + llvm::capacity_in_bytes(CommentHandlers);
315 if (IncludeExternalMacros && ExternalSource &&
316 !ReadMacrosFromExternalSource) {
317 ReadMacrosFromExternalSource =
true;
321 return CurSubmoduleState->Macros.end();
328 std::equal(Tokens.begin(), Tokens.end(), MI->
tokens_begin());
335 StringRef BestSpelling;
339 Def =
I->second.findDirectiveAtLoc(Loc,
SourceMgr);
351 BestLocation = Location;
352 BestSpelling =
I->first->getName();
360 CurLexerKind = CLK_Lexer;
361 else if (CurPTHLexer)
362 CurLexerKind = CLK_PTHLexer;
363 else if (CurTokenLexer)
364 CurLexerKind = CLK_TokenLexer;
366 CurLexerKind = CLK_CachingLexer;
370 unsigned CompleteLine,
371 unsigned CompleteColumn) {
373 assert(CompleteLine && CompleteColumn &&
"Starts from 1:1");
374 assert(!CodeCompletionFile &&
"Already set");
376 using llvm::MemoryBuffer;
379 bool Invalid =
false;
385 const char *
Position = Buffer->getBufferStart();
388 if (*Position !=
'\r' && *Position !=
'\n')
392 if ((Position[1] ==
'\r' || Position[1] ==
'\n') &&
393 Position[0] != Position[1])
400 Position += CompleteColumn - 1;
404 if (SkipMainFilePreamble.first &&
406 if (Position - Buffer->getBufferStart() < SkipMainFilePreamble.first)
407 Position = Buffer->getBufferStart() + SkipMainFilePreamble.first;
410 if (Position > Buffer->getBufferEnd())
411 Position = Buffer->getBufferEnd();
413 CodeCompletionFile = File;
414 CodeCompletionOffset = Position - Buffer->getBufferStart();
416 std::unique_ptr<MemoryBuffer> NewBuffer =
417 MemoryBuffer::getNewUninitMemBuffer(Buffer->getBufferSize() + 1,
418 Buffer->getBufferIdentifier());
419 char *NewBuf =
const_cast<char*
>(NewBuffer->getBufferStart());
420 char *NewPos = std::copy(Buffer->getBufferStart(),
Position, NewBuf);
422 std::copy(Position, Buffer->getBufferEnd(), NewPos+1);
439 bool *Invalid)
const {
441 if (Tok.
isNot(tok::raw_identifier) && !Tok.
hasUCN()) {
444 return II->getName();
451 const char *Ptr = Buffer.data();
453 return StringRef(Ptr, Len);
465 SourceLocation Loc = ScratchBuf->getToken(Str.data(), Str.size(), DestPtr);
467 if (ExpansionLocStart.
isValid())
469 ExpansionLocEnd, Str.size());
473 if (Tok.
is(tok::raw_identifier))
497 assert(NumEnteredSourceFiles == 0 &&
"Cannot reenter the main file!");
508 if (SkipMainFilePreamble.first > 0)
509 CurLexer->SkipBytes(SkipMainFilePreamble.first,
510 SkipMainFilePreamble.second);
519 std::unique_ptr<llvm::MemoryBuffer> SB =
520 llvm::MemoryBuffer::getMemBufferCopy(Predefines,
"<built-in>");
521 assert(SB &&
"Cannot create predefined source buffer");
523 assert(FID.
isValid() &&
"Could not create FileID for predefines?");
524 setPredefinesFileID(FID);
533 Callbacks->EndOfMainFile();
544 assert(!Identifier.
getRawIdentifier().empty() &&
"No raw identifier data!");
554 StringRef CleanedStr =
getSpelling(Identifier, IdentifierBuffer);
556 if (Identifier.
hasUCN()) {
567 Identifier.
setKind(II->getTokenID());
573 PoisonReasons[II] = DiagID;
577 assert(Ident__exception_code && Ident__exception_info);
578 assert(Ident___exception_code && Ident___exception_info);
592 "Can't handle identifiers without identifier info!");
593 llvm::DenseMap<IdentifierInfo*,unsigned>::const_iterator it =
595 if(it == PoisonReasons.end())
596 Diag(Identifier, diag::err_pp_used_poisoned_id);
607 if (LangOpts.CPlusPlus)
608 return llvm::StringSwitch<diag::kind>(II.
getName())
610 .Case(#NAME, diag::warn_cxx11_keyword)
611 #include "clang/Basic/TokenKinds.def"
615 "Keyword not known to come from a newer Standard or proposed Standard");
628 "Can't handle identifiers without identifier info!");
637 if (II.isOutOfDate()) {
638 bool CurrentIsPoisoned =
false;
639 if (&II == Ident__VA_ARGS__)
640 CurrentIsPoisoned = Ident__VA_ARGS__->
isPoisoned();
643 Identifier.
setKind(II.getTokenID());
645 if (&II == Ident__VA_ARGS__)
646 II.setIsPoisoned(CurrentIsPoisoned);
651 if (II.isPoisoned() && CurPPLexer) {
657 auto *MI = MD.getMacroInfo();
658 assert(MI &&
"macro definition with no macro info?");
659 if (!DisableMacroExpansion) {
663 if (!MI->isFunctionLike() || isNextPPTokenLParen())
664 return HandleMacroExpandedIdentifier(Identifier, MD);
670 if (MI->isObjectLike() || isNextPPTokenLParen())
671 Diag(Identifier, diag::pp_disabled_macro_expansion);
681 if (II.isFutureCompatKeyword() && !DisableMacroExpansion) {
685 II.setIsFutureCompatKeyword(
false);
691 if (II.isCPlusPlusOperatorKeyword())
698 if (II.isExtensionToken() && !DisableMacroExpansion)
699 Diag(Identifier, diag::ext_token_used);
707 if (LastTokenWasAt && II.isModulesImport() && !InMacroArgs &&
708 !DisableMacroExpansion &&
710 CurLexerKind != CLK_CachingLexer) {
712 ModuleImportPath.clear();
713 ModuleImportExpectsIdentifier =
true;
714 CurLexerKind = CLK_LexAfterModuleImport;
723 switch (CurLexerKind) {
725 ReturnedToken = CurLexer->Lex(Result);
728 ReturnedToken = CurPTHLexer->Lex(Result);
731 ReturnedToken = CurTokenLexer->Lex(Result);
733 case CLK_CachingLexer:
735 ReturnedToken =
true;
737 case CLK_LexAfterModuleImport:
739 ReturnedToken =
true;
742 }
while (!ReturnedToken);
744 LastTokenWasAt = Result.
is(tok::at);
763 if (ModuleImportExpectsIdentifier && Result.
getKind() == tok::identifier) {
768 ModuleImportExpectsIdentifier =
false;
769 CurLexerKind = CLK_LexAfterModuleImport;
775 if (!ModuleImportExpectsIdentifier && Result.
getKind() == tok::period) {
776 ModuleImportExpectsIdentifier =
true;
777 CurLexerKind = CLK_LexAfterModuleImport;
782 if (!ModuleImportPath.empty()) {
783 Module *Imported =
nullptr;
785 Imported = TheModuleLoader.
loadModule(ModuleImportLoc,
793 Callbacks->moduleImport(ModuleImportLoc, ModuleImportPath, Imported);
798 CurSubmoduleState->VisibleModules.setVisible(
803 Diag(ModuleImportLoc, diag::warn_module_conflict)
804 << Path[0]->getFullModuleName()
805 << Conflict->getFullModuleName()
810 if (!BuildingSubmoduleStack.empty() && M != BuildingSubmoduleStack.back().M)
811 BuildingSubmoduleStack.back().M->Imports.insert(M);
815 const char *DiagnosticTag,
816 bool AllowMacroExpansion) {
818 if (Result.
isNot(tok::string_literal)) {
819 Diag(Result, diag::err_expected_string_literal)
820 << 0 << DiagnosticTag;
827 StrToks.push_back(Result);
830 Diag(Result, diag::err_invalid_string_udl);
832 if (AllowMacroExpansion)
836 }
while (Result.
is(tok::string_literal));
840 assert(Literal.
isAscii() &&
"Didn't allow wide strings in");
846 Diag(StrToks[0].getLocation(), diag::err_expected_string_literal)
847 << 0 << DiagnosticTag;
856 assert(Tok.
is(tok::numeric_constant));
858 bool NumberInvalid =
false;
859 StringRef Spelling =
getSpelling(Tok, IntegerBuffer, &NumberInvalid);
863 if (Literal.hadError || !Literal.isIntegerLiteral() || Literal.hasUDSuffix())
865 llvm::APInt APVal(64, 0);
866 if (Literal.GetIntegerValue(APVal))
869 Value = APVal.getLimitedValue();
874 assert(Handler &&
"NULL comment handler");
875 assert(std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler) ==
876 CommentHandlers.end() &&
"Comment handler already registered");
877 CommentHandlers.push_back(Handler);
882 = std::find(CommentHandlers.begin(), CommentHandlers.end(), Handler);
883 assert(Pos != CommentHandlers.end() &&
"Comment handler not registered");
884 CommentHandlers.erase(Pos);
888 bool AnyPendingTokens =
false;
890 HEnd = CommentHandlers.end();
892 if ((*H)->HandleComment(*
this, Comment))
893 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.
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