clang 22.0.0git
clang::PreprocessorLexer Class Referenceabstract

#include "clang/Lex/PreprocessorLexer.h"

Inheritance diagram for clang::PreprocessorLexer:
[legend]

Public Types

using conditional_iterator
 Iterator that traverses the current stack of preprocessor conditional directives (#if/#ifdef/#ifndef).

Public Member Functions

 PreprocessorLexer (const PreprocessorLexer &)=delete
PreprocessorLexeroperator= (const PreprocessorLexer &)=delete
void LexIncludeFilename (Token &FilenameTok)
 Lex a token, producing a header-name token if possible.
void setParsingPreprocessorDirective (bool f)
 Inform the lexer whether or not we are currently lexing a preprocessor directive.
bool isLexingRawMode () const
 Return true if this lexer is in raw mode or not.
PreprocessorgetPP () const
 Return the preprocessor object for this lexer.
FileID getFileID () const
unsigned getInitialNumSLocEntries () const
 Number of SLocEntries before lexing the file.
OptionalFileEntryRef getFileEntry () const
 getFileEntry - Return the FileEntry corresponding to this FileID.
conditional_iterator conditional_begin () const
conditional_iterator conditional_end () const
void setConditionalLevels (ArrayRef< PPConditionalInfo > CL)

Protected Member Functions

 PreprocessorLexer ()
 PreprocessorLexer (Preprocessor *pp, FileID fid)
virtual ~PreprocessorLexer ()=default
virtual void IndirectLex (Token &Result)=0
virtual SourceLocation getSourceLocation ()=0
 Return the source location for the next observable location.
void pushConditionalLevel (SourceLocation DirectiveStart, bool WasSkipping, bool FoundNonSkip, bool FoundElse)
 pushConditionalLevel - When we enter a #if directive, this keeps track of what we are currently in for diagnostic emission (e.g.
void pushConditionalLevel (const PPConditionalInfo &CI)
bool popConditionalLevel (PPConditionalInfo &CI)
 popConditionalLevel - Remove an entry off the top of the conditional stack, returning information about it.
PPConditionalInfopeekConditionalLevel ()
 Return the top of the conditional stack.
unsigned getConditionalStackDepth () const

Protected Attributes

PreprocessorPP = nullptr
const FileID FID
 The SourceManager FileID corresponding to the file being lexed.
unsigned InitialNumSLocEntries = 0
 Number of SLocEntries before lexing the file.
bool ParsingPreprocessorDirective = false
 True when parsing #XXX; turns '\n' into a tok::eod token.
bool ParsingFilename = false
 True after #include; turns <xx> or "xxx" into a tok::header_name token.
bool LexingRawMode = false
 True if in raw mode.
MultipleIncludeOpt MIOpt
 A state machine that detects the #ifndef-wrapping a file idiom for the multiple-include optimization.
SmallVector< PPConditionalInfo, 4 > ConditionalStack
 Information about the set of #if/#ifdef/#ifndef blocks we are currently in.

Friends

class Preprocessor

Detailed Description

Definition at line 30 of file PreprocessorLexer.h.

Member Typedef Documentation

◆ conditional_iterator

Initial value:

Iterator that traverses the current stack of preprocessor conditional directives (#if/#ifdef/#ifndef).

Definition at line 164 of file PreprocessorLexer.h.

Constructor & Destructor Documentation

◆ PreprocessorLexer() [1/3]

clang::PreprocessorLexer::PreprocessorLexer ( )
inlineprotected

Definition at line 78 of file PreprocessorLexer.h.

References FID.

Referenced by clang::Lexer::Lexer(), operator=(), and PreprocessorLexer().

◆ PreprocessorLexer() [2/3]

PreprocessorLexer::PreprocessorLexer ( Preprocessor * pp,
FileID fid )
protected

◆ ~PreprocessorLexer()

virtual clang::PreprocessorLexer::~PreprocessorLexer ( )
protectedvirtualdefault

◆ PreprocessorLexer() [3/3]

clang::PreprocessorLexer::PreprocessorLexer ( const PreprocessorLexer & )
delete

References PreprocessorLexer().

Member Function Documentation

◆ conditional_begin()

conditional_iterator clang::PreprocessorLexer::conditional_begin ( ) const
inline

Definition at line 167 of file PreprocessorLexer.h.

References ConditionalStack.

◆ conditional_end()

conditional_iterator clang::PreprocessorLexer::conditional_end ( ) const
inline

Definition at line 171 of file PreprocessorLexer.h.

References ConditionalStack.

◆ getConditionalStackDepth()

unsigned clang::PreprocessorLexer::getConditionalStackDepth ( ) const
inlineprotected

Definition at line 123 of file PreprocessorLexer.h.

References ConditionalStack.

◆ getFileEntry()

OptionalFileEntryRef PreprocessorLexer::getFileEntry ( ) const

getFileEntry - Return the FileEntry corresponding to this FileID.

Like getFileID(), this only works for lexers with attached preprocessors.

Definition at line 49 of file PreprocessorLexer.cpp.

References getFileID(), and PP.

Referenced by clang::Preprocessor::HandlePragmaDependency(), and clang::Preprocessor::HandlePragmaSystemHeader().

◆ getFileID()

FileID clang::PreprocessorLexer::getFileID ( ) const
inline

Definition at line 147 of file PreprocessorLexer.h.

References FID, and PP.

Referenced by getFileEntry(), and clang::Preprocessor::LookupFile().

◆ getInitialNumSLocEntries()

unsigned clang::PreprocessorLexer::getInitialNumSLocEntries ( ) const
inline

Number of SLocEntries before lexing the file.

Definition at line 154 of file PreprocessorLexer.h.

References InitialNumSLocEntries.

◆ getPP()

Preprocessor * clang::PreprocessorLexer::getPP ( ) const
inline

Return the preprocessor object for this lexer.

Definition at line 145 of file PreprocessorLexer.h.

References PP, and Preprocessor.

◆ getSourceLocation()

virtual SourceLocation clang::PreprocessorLexer::getSourceLocation ( )
protectedpure virtual

Return the source location for the next observable location.

Implemented in clang::Lexer.

◆ IndirectLex()

virtual void clang::PreprocessorLexer::IndirectLex ( Token & Result)
protectedpure virtual

References clang::Result.

Referenced by LexIncludeFilename().

◆ isLexingRawMode()

bool clang::PreprocessorLexer::isLexingRawMode ( ) const
inline

Return true if this lexer is in raw mode or not.

Definition at line 142 of file PreprocessorLexer.h.

References LexingRawMode.

Referenced by DecodeTrigraphChar(), isEndOfBlockCommentWithEscapedNewLine(), and clang::Lexer::Lex().

◆ LexIncludeFilename()

void PreprocessorLexer::LexIncludeFilename ( Token & FilenameTok)

Lex a token, producing a header-name token if possible.

After the preprocessor has parsed a #include, lex and (potentially) macro expand the filename.

Definition at line 31 of file PreprocessorLexer.cpp.

References IndirectLex(), LexingRawMode, ParsingFilename, and PP.

◆ operator=()

PreprocessorLexer & clang::PreprocessorLexer::operator= ( const PreprocessorLexer & )
delete

References PreprocessorLexer().

◆ peekConditionalLevel()

PPConditionalInfo & clang::PreprocessorLexer::peekConditionalLevel ( )
inlineprotected

Return the top of the conditional stack.

Precondition
This requires that there be a conditional active.

Definition at line 118 of file PreprocessorLexer.h.

References ConditionalStack.

◆ popConditionalLevel()

bool clang::PreprocessorLexer::popConditionalLevel ( PPConditionalInfo & CI)
inlineprotected

popConditionalLevel - Remove an entry off the top of the conditional stack, returning information about it.

If the conditional stack is empty, this returns true and does not fill in the arguments.

Definition at line 109 of file PreprocessorLexer.h.

References ConditionalStack.

◆ pushConditionalLevel() [1/2]

void clang::PreprocessorLexer::pushConditionalLevel ( const PPConditionalInfo & CI)
inlineprotected

Definition at line 102 of file PreprocessorLexer.h.

References ConditionalStack.

◆ pushConditionalLevel() [2/2]

void clang::PreprocessorLexer::pushConditionalLevel ( SourceLocation DirectiveStart,
bool WasSkipping,
bool FoundNonSkip,
bool FoundElse )
inlineprotected

pushConditionalLevel - When we enter a #if directive, this keeps track of what we are currently in for diagnostic emission (e.g.

#if with missing #endif).

Definition at line 93 of file PreprocessorLexer.h.

References ConditionalStack, clang::PPConditionalInfo::FoundElse, clang::PPConditionalInfo::FoundNonSkip, clang::PPConditionalInfo::IfLoc, and clang::PPConditionalInfo::WasSkipping.

◆ setConditionalLevels()

void clang::PreprocessorLexer::setConditionalLevels ( ArrayRef< PPConditionalInfo > CL)
inline

Definition at line 175 of file PreprocessorLexer.h.

References ConditionalStack.

◆ setParsingPreprocessorDirective()

void clang::PreprocessorLexer::setParsingPreprocessorDirective ( bool f)
inline

Inform the lexer whether or not we are currently lexing a preprocessor directive.

Definition at line 137 of file PreprocessorLexer.h.

References ParsingPreprocessorDirective.

Referenced by clang::scanInputForCXX20ModulesUsage().

◆ Preprocessor

friend class Preprocessor
friend

Definition at line 34 of file PreprocessorLexer.h.

References Preprocessor.

Referenced by getPP(), Preprocessor, and PreprocessorLexer().

Member Data Documentation

◆ ConditionalStack

SmallVector<PPConditionalInfo, 4> clang::PreprocessorLexer::ConditionalStack
protected

Information about the set of #if/#ifdef/#ifndef blocks we are currently in.

Definition at line 76 of file PreprocessorLexer.h.

Referenced by conditional_begin(), conditional_end(), getConditionalStackDepth(), peekConditionalLevel(), popConditionalLevel(), pushConditionalLevel(), pushConditionalLevel(), and setConditionalLevels().

◆ FID

const FileID clang::PreprocessorLexer::FID
protected

◆ InitialNumSLocEntries

unsigned clang::PreprocessorLexer::InitialNumSLocEntries = 0
protected

Number of SLocEntries before lexing the file.

Definition at line 43 of file PreprocessorLexer.h.

Referenced by getInitialNumSLocEntries(), and PreprocessorLexer().

◆ LexingRawMode

bool clang::PreprocessorLexer::LexingRawMode = false
protected

True if in raw mode.

Raw mode disables interpretation of tokens and is a far faster mode to lex in than non-raw-mode. This flag:

  1. If EOF of the current lexer is found, the include stack isn't popped.
  2. Identifier information is not looked up for identifier tokens. As an effect of this, implicit macro expansion is naturally disabled.
  3. "#" tokens at the start of a line are treated as normal tokens, not implicitly transformed by the lexer.
  4. All diagnostic messages are disabled.
  5. No callbacks are made into the preprocessor.

Note that in raw mode that the PP pointer may be null.

Definition at line 68 of file PreprocessorLexer.h.

Referenced by clang::Preprocessor::HandleMicrosoftCommentPaste(), isLexingRawMode(), clang::Lexer::Lexer(), clang::Lexer::LexFromRawLexer(), LexIncludeFilename(), and clang::Lexer::SetKeepWhitespaceMode().

◆ MIOpt

MultipleIncludeOpt clang::PreprocessorLexer::MIOpt
protected

A state machine that detects the #ifndef-wrapping a file idiom for the multiple-include optimization.

Definition at line 72 of file PreprocessorLexer.h.

◆ ParsingFilename

bool clang::PreprocessorLexer::ParsingFilename = false
protected

True after #include; turns <xx> or "xxx" into a tok::header_name token.

Definition at line 53 of file PreprocessorLexer.h.

Referenced by LexIncludeFilename(), and clang::Lexer::ReadToEndOfLine().

◆ ParsingPreprocessorDirective

bool clang::PreprocessorLexer::ParsingPreprocessorDirective = false
protected

True when parsing #XXX; turns '\n' into a tok::eod token.

Definition at line 50 of file PreprocessorLexer.h.

Referenced by clang::Lexer::Create_PragmaLexer(), clang::Preprocessor::HandleMicrosoftCommentPaste(), clang::Lexer::ReadToEndOfLine(), and setParsingPreprocessorDirective().

◆ PP


The documentation for this class was generated from the following files: