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

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

Public Member Functions

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 (const PreprocessorLexer &)=delete
 
void operator= (const PreprocessorLexer &)=delete
 
 PreprocessorLexer (Preprocessor *pp, FileID fid)
 
 PreprocessorLexer ()
 
virtual ~PreprocessorLexer ()
 
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
 
const FileID FID
 The SourceManager FileID corresponding to the file being lexed. More...
 
unsigned InitialNumSLocEntries
 Number of SLocEntries before lexing the file. More...
 
bool ParsingPreprocessorDirective
 True when parsing #XXX; turns '\n' into a tok::eod token. More...
 
bool ParsingFilename
 True after #include; turns <xx> into a tok::angle_string_literal token. More...
 
bool LexingRawMode
 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 28 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 172 of file PreprocessorLexer.h.

Constructor & Destructor Documentation

◆ PreprocessorLexer() [1/3]

clang::PreprocessorLexer::PreprocessorLexer ( const PreprocessorLexer )
protecteddelete

◆ PreprocessorLexer() [2/3]

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

◆ PreprocessorLexer() [3/3]

clang::PreprocessorLexer::PreprocessorLexer ( )
inlineprotected

Definition at line 79 of file PreprocessorLexer.h.

◆ ~PreprocessorLexer()

virtual clang::PreprocessorLexer::~PreprocessorLexer ( )
inlineprotectedvirtual

Definition at line 85 of file PreprocessorLexer.h.

References getSourceLocation(), IndirectLex(), and clang::Result.

Member Function Documentation

◆ conditional_begin()

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

Definition at line 174 of file PreprocessorLexer.h.

◆ conditional_end()

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

Definition at line 177 of file PreprocessorLexer.h.

◆ getConditionalStackDepth()

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

Definition at line 128 of file PreprocessorLexer.h.

References LexIncludeFilename().

◆ 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 56 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 154 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 161 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 152 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 32 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=()

void clang::PreprocessorLexer::operator= ( const PreprocessorLexer )
protecteddelete

◆ 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 123 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 114 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 98 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 107 of file PreprocessorLexer.h.

◆ setConditionalLevels()

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

Definition at line 181 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 144 of file PreprocessorLexer.h.

Friends And Related Function Documentation

◆ Preprocessor

friend class Preprocessor
friend

Definition at line 75 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 71 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 34 of file PreprocessorLexer.h.

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

◆ InitialNumSLocEntries

unsigned clang::PreprocessorLexer::InitialNumSLocEntries
protected

Number of SLocEntries before lexing the file.

Definition at line 37 of file PreprocessorLexer.h.

Referenced by getInitialNumSLocEntries(), and PreprocessorLexer().

◆ LexingRawMode

bool clang::PreprocessorLexer::LexingRawMode
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 63 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 67 of file PreprocessorLexer.h.

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

◆ ParsingFilename

bool clang::PreprocessorLexer::ParsingFilename
protected

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

Definition at line 48 of file PreprocessorLexer.h.

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

◆ ParsingPreprocessorDirective

bool clang::PreprocessorLexer::ParsingPreprocessorDirective
protected

◆ PP

Preprocessor* clang::PreprocessorLexer::PP
protected

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