clang  6.0.0svn
Public Types | Public Member Functions | Protected Member Functions | Protected Attributes | Friends | List of all members
clang::PreprocessorLexer Class Referenceabstract

#include "clang/Lex/PreprocessorLexer.h"

Inheritance diagram for clang::PreprocessorLexer:
Inheritance graph
[legend]
Collaboration diagram for clang::PreprocessorLexer:
Collaboration graph
[legend]

Public Types

using conditional_iterator = SmallVectorImpl< PPConditionalInfo >::const_iterator
 Iterator that traverses the current stack of preprocessor conditional directives (#if/#ifdef/#ifndef). More...
 

Public Member Functions

 PreprocessorLexer (const PreprocessorLexer &)=delete
 
PreprocessorLexeroperator= (const PreprocessorLexer &)=delete
 
void LexIncludeFilename (Token &Result)
 After the preprocessor has parsed a #include, lex and (potentially) macro expand the filename. More...
 
void setParsingPreprocessorDirective (bool f)
 Inform the lexer whether or not we are currently lexing a preprocessor directive. More...
 
bool isLexingRawMode () const
 Return true if this lexer is in raw mode or not. More...
 
PreprocessorgetPP () const
 Return the preprocessor object for this lexer. More...
 
FileID getFileID () const
 
unsigned getInitialNumSLocEntries () const
 Number of SLocEntries before lexing the file. More...
 
const FileEntrygetFileEntry () const
 getFileEntry - Return the FileEntry corresponding to this FileID. More...
 
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. More...
 
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. More...
 
void pushConditionalLevel (const PPConditionalInfo &CI)
 
bool popConditionalLevel (PPConditionalInfo &CI)
 popConditionalLevel - Remove an entry off the top of the conditional stack, returning information about it. More...
 
PPConditionalInfopeekConditionalLevel ()
 Return the top of the conditional stack. More...
 
unsigned getConditionalStackDepth () const
 

Protected Attributes

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

Friends

class Preprocessor
 

Detailed Description

Definition at line 30 of file PreprocessorLexer.h.

Member Typedef Documentation

◆ conditional_iterator

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

Definition at line 170 of file PreprocessorLexer.h.

Constructor & Destructor Documentation

◆ PreprocessorLexer() [1/3]

clang::PreprocessorLexer::PreprocessorLexer ( )
inlineprotected

◆ PreprocessorLexer() [2/3]

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

◆ ~PreprocessorLexer()

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

Referenced by PreprocessorLexer().

◆ PreprocessorLexer() [3/3]

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

Member Function Documentation

◆ conditional_begin()

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

Definition at line 172 of file PreprocessorLexer.h.

◆ conditional_end()

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

Definition at line 176 of file PreprocessorLexer.h.

◆ getConditionalStackDepth()

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

Definition at line 124 of file PreprocessorLexer.h.

References LexIncludeFilename(), operator=(), and PreprocessorLexer().

◆ getFileEntry()

const FileEntry * PreprocessorLexer::getFileEntry ( ) const

getFileEntry - Return the FileEntry corresponding to this FileID.

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

Definition at line 57 of file PreprocessorLexer.cpp.

References clang::SourceManager::getFileEntryForID(), getFileID(), clang::Preprocessor::getSourceManager(), and PP.

Referenced by EvaluateHasIncludeNext(), getInitialNumSLocEntries(), clang::Preprocessor::HandlePragmaSystemHeader(), and clang::Preprocessor::LookupFile().

◆ getFileID()

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

Definition at line 152 of file PreprocessorLexer.h.

References FID.

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

◆ getInitialNumSLocEntries()

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

Number of SLocEntries before lexing the file.

Definition at line 159 of file PreprocessorLexer.h.

References getFileEntry(), and InitialNumSLocEntries.

◆ getPP()

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

Return the preprocessor object for this lexer.

Definition at line 150 of file PreprocessorLexer.h.

References PP.

◆ getSourceLocation()

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

Return the source location for the next observable location.

Implemented in clang::Lexer, and clang::PTHLexer.

Referenced by clang::Preprocessor::CheckEndOfDirective(), and PreprocessorLexer().

◆ IndirectLex()

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

Implemented in clang::PTHLexer.

Referenced by LexIncludeFilename(), and PreprocessorLexer().

◆ isLexingRawMode()

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

◆ LexIncludeFilename()

void PreprocessorLexer::LexIncludeFilename ( Token FilenameTok)

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

If the sequence parsed is not lexically legal, emit a diagnostic and return a result EOD token.

Definition at line 33 of file PreprocessorLexer.cpp.

References clang::Preprocessor::Diag(), clang::Token::getLocation(), IndirectLex(), clang::Token::is(), clang::Preprocessor::Lex(), LexingRawMode, ParsingFilename, ParsingPreprocessorDirective, and PP.

Referenced by EvaluateHasIncludeCommon(), and getConditionalStackDepth().

◆ operator=()

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

◆ 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 119 of file PreprocessorLexer.h.

Referenced by clang::Preprocessor::CheckEndOfDirective().

◆ 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 110 of file PreprocessorLexer.h.

Referenced by clang::Preprocessor::CheckEndOfDirective().

◆ pushConditionalLevel() [1/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 94 of file PreprocessorLexer.h.

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

Referenced by clang::Preprocessor::CheckEndOfDirective().

◆ pushConditionalLevel() [2/2]

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

Definition at line 103 of file PreprocessorLexer.h.

◆ setConditionalLevels()

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

Definition at line 180 of file PreprocessorLexer.h.

Referenced by clang::Preprocessor::EnterMainSourceFile().

◆ setParsingPreprocessorDirective()

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

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

Definition at line 142 of file PreprocessorLexer.h.

Friends And Related Function Documentation

◆ Preprocessor

friend class Preprocessor
friend

Definition at line 34 of file PreprocessorLexer.h.

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 77 of file PreprocessorLexer.h.

Referenced by clang::PTHLexer::Lex(), and clang::Lexer::ReadToEndOfLine().

◆ FID

const FileID clang::PreprocessorLexer::FID
protected

The SourceManager FileID corresponding to the file being lexed.

Definition at line 40 of file PreprocessorLexer.h.

Referenced by getFileID(), clang::Lexer::getImmediateMacroName(), and makeRangeFromFileLocs().

◆ 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 69 of file PreprocessorLexer.h.

Referenced by clang::Preprocessor::CheckEndOfDirective(), findPlaceholderEnd(), clang::Preprocessor::HandleMicrosoftCommentPaste(), isLexingRawMode(), clang::PTHLexer::Lex(), clang::Lexer::Lexer(), LexIncludeFilename(), maybeDiagnoseIDCharCompat(), and clang::Lexer::ReadToEndOfLine().

◆ 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 73 of file PreprocessorLexer.h.

Referenced by findPlaceholderEnd(), isTrivialSingleTokenExpansion(), and clang::PTHLexer::Lex().

◆ ParsingFilename

bool clang::PreprocessorLexer::ParsingFilename = false
protected

True after #include; turns <xx> into a tok::angle_string_literal token.

Definition at line 54 of file PreprocessorLexer.h.

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

◆ ParsingPreprocessorDirective

bool clang::PreprocessorLexer::ParsingPreprocessorDirective = false
protected

◆ PP

Preprocessor* clang::PreprocessorLexer::PP = nullptr
protected

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