diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-11-12 23:13:54 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-11-12 23:13:54 +0000 |
commit | d6a2e7d71e9a910c45a3eb0268a5d94635003d58 (patch) | |
tree | 17c208f99eaa5e4b60d56cc6fc5060af02bcc51e | |
parent | 2c71d0f00e40b7b0a85561d430f52247b9c6e7f2 (diff) |
Move some diagnostic handling to PreprocessorLexer.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59191 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Lex/Lexer.h | 3 | ||||
-rw-r--r-- | include/clang/Lex/PTHLexer.h | 4 | ||||
-rw-r--r-- | include/clang/Lex/PreprocessorLexer.h | 16 | ||||
-rw-r--r-- | lib/Lex/Lexer.cpp | 15 | ||||
-rw-r--r-- | lib/Lex/PTHLexer.cpp | 9 | ||||
-rw-r--r-- | lib/Lex/PreprocessorLexer.cpp | 7 |
6 files changed, 29 insertions, 25 deletions
diff --git a/include/clang/Lex/Lexer.h b/include/clang/Lex/Lexer.h index f3f8c739cf..3542ff4bc7 100644 --- a/include/clang/Lex/Lexer.h +++ b/include/clang/Lex/Lexer.h @@ -36,7 +36,6 @@ class Lexer : public PreprocessorLexer { const char *BufferStart; // Start of the buffer. const char *BufferEnd; // End of the buffer. SourceLocation FileLoc; // Location for start of file. - Preprocessor *PP; // Preprocessor object controlling lexing. LangOptions Features; // Features enabled by this language (cache). bool Is_PragmaLexer; // True if lexer for _Pragma handling. @@ -171,8 +170,6 @@ public: /// position in the current buffer into a SourceLocation object for rendering. void Diag(const char *Loc, unsigned DiagID, const std::string &Msg = std::string()) const; - void Diag(SourceLocation Loc, unsigned DiagID, - const std::string &Msg = std::string()) const; /// getSourceLocation - Return a source location identifier for the specified /// offset in the current file. diff --git a/include/clang/Lex/PTHLexer.h b/include/clang/Lex/PTHLexer.h index cdca3419a2..2985b24cb5 100644 --- a/include/clang/Lex/PTHLexer.h +++ b/include/clang/Lex/PTHLexer.h @@ -19,10 +19,6 @@ namespace clang { class PTHLexer : public PreprocessorLexer { - - /// PP - Preprocessor. - Preprocessor& PP; - /// FileLoc - Location for the start of the file. /// SourceLocation FileLoc; diff --git a/include/clang/Lex/PreprocessorLexer.h b/include/clang/Lex/PreprocessorLexer.h index bbe6dbeeac..de9c6b780a 100644 --- a/include/clang/Lex/PreprocessorLexer.h +++ b/include/clang/Lex/PreprocessorLexer.h @@ -17,14 +17,19 @@ #include "clang/Lex/MultipleIncludeOpt.h" #include "clang/Lex/Token.h" #include <vector> - +#include <string> + namespace clang { class Preprocessor; class PreprocessorLexer { -protected: +protected: + Preprocessor *PP; // Preprocessor object controlling lexing. + + //===--------------------------------------------------------------------===// // Context-specific lexing flags set by the preprocessor. + //===--------------------------------------------------------------------===// /// ParsingPreprocessorDirective - This is true when parsing #XXX. This turns /// '\n' into a tok::eom token. @@ -59,12 +64,15 @@ protected: void operator=(const PreprocessorLexer&); // DO NOT IMPLEMENT friend class Preprocessor; - PreprocessorLexer() {} + PreprocessorLexer(Preprocessor* pp) : PP(pp) {} virtual ~PreprocessorLexer(); virtual void IndirectLex(Token& Result) = 0; -protected: + /// Diag - Forwarding function for diagnostics. This translate a source + /// position in the current buffer into a SourceLocation object for rendering. + void Diag(SourceLocation Loc, unsigned DiagID, + const std::string &Msg = std::string()) const; //===--------------------------------------------------------------------===// // #if directive handling. diff --git a/lib/Lex/Lexer.cpp b/lib/Lex/Lexer.cpp index b71452bc52..4e93600a87 100644 --- a/lib/Lex/Lexer.cpp +++ b/lib/Lex/Lexer.cpp @@ -63,7 +63,7 @@ tok::ObjCKeywordKind Token::getObjCKeywordID() const { /// outlive it, so it doesn't take ownership of either of them. Lexer::Lexer(SourceLocation fileloc, Preprocessor &pp, const char *BufStart, const char *BufEnd) - : FileLoc(fileloc), PP(&pp), Features(pp.getLangOptions()) { + : PreprocessorLexer(&pp), FileLoc(fileloc), Features(pp.getLangOptions()) { SourceManager &SourceMgr = PP->getSourceManager(); unsigned InputFileID = SourceMgr.getPhysicalLoc(FileLoc).getFileID(); @@ -110,7 +110,7 @@ Lexer::Lexer(SourceLocation fileloc, Preprocessor &pp, Lexer::Lexer(SourceLocation fileloc, const LangOptions &features, const char *BufStart, const char *BufEnd, const llvm::MemoryBuffer *FromFile) - : FileLoc(fileloc), PP(0), Features(features) { + : PreprocessorLexer(0), FileLoc(fileloc), Features(features) { Is_PragmaLexer = false; InitCharacterInfo(); @@ -312,13 +312,6 @@ void Lexer::Diag(const char *Loc, unsigned DiagID, return; PP->Diag(getSourceLocation(Loc), DiagID, Msg); } -void Lexer::Diag(SourceLocation Loc, unsigned DiagID, - const std::string &Msg) const { - if (LexingRawMode && Diagnostic::isBuiltinNoteWarningOrExtension(DiagID)) - return; - PP->Diag(Loc, DiagID, Msg); -} - //===----------------------------------------------------------------------===// // Trigraph and Escaped Newline Handling Code. @@ -1138,7 +1131,9 @@ bool Lexer::LexEndOfFile(Token &Result, const char *CurPtr) { // If we are in a #if directive, emit an error. while (!ConditionalStack.empty()) { - Diag(ConditionalStack.back().IfLoc, diag::err_pp_unterminated_conditional); + PreprocessorLexer::Diag(ConditionalStack.back().IfLoc, + diag::err_pp_unterminated_conditional); + ConditionalStack.pop_back(); } diff --git a/lib/Lex/PTHLexer.cpp b/lib/Lex/PTHLexer.cpp index e1b392068c..b0ecb270d9 100644 --- a/lib/Lex/PTHLexer.cpp +++ b/lib/Lex/PTHLexer.cpp @@ -20,7 +20,8 @@ using namespace clang; PTHLexer::PTHLexer(Preprocessor& pp, SourceLocation fileloc, const Token *TokArray, unsigned NumToks) - : PP(pp), FileLoc(fileloc), Tokens(TokArray), NumTokens(NumToks), CurToken(0){ + : PreprocessorLexer(&pp), FileLoc(fileloc), Tokens(TokArray), + NumTokens(NumToks), CurToken(0) { assert (Tokens[NumTokens-1].is(tok::eof)); --NumTokens; @@ -46,7 +47,7 @@ void PTHLexer::Lex(Token& Tok) { // FIXME: eom handling? } else - PP.HandleEndOfFile(Tok, false); + PP->HandleEndOfFile(Tok, false); return; } @@ -65,8 +66,8 @@ void PTHLexer::Lex(Token& Tok) { ++CurToken; if (Tok.isAtStartOfLine() && Tok.is(tok::hash) && !LexingRawMode) { - PP.HandleDirective(Tok); - PP.Lex(Tok); + PP->HandleDirective(Tok); + PP->Lex(Tok); return; } diff --git a/lib/Lex/PreprocessorLexer.cpp b/lib/Lex/PreprocessorLexer.cpp index f3d91af4ed..3c5d81b8a7 100644 --- a/lib/Lex/PreprocessorLexer.cpp +++ b/lib/Lex/PreprocessorLexer.cpp @@ -20,6 +20,13 @@ using namespace clang; PreprocessorLexer::~PreprocessorLexer() {} +void PreprocessorLexer::Diag(SourceLocation Loc, unsigned DiagID, + const std::string &Msg) const { + if (LexingRawMode && Diagnostic::isBuiltinNoteWarningOrExtension(DiagID)) + return; + PP->Diag(Loc, DiagID, Msg); +} + /// LexIncludeFilename - After the preprocessor has parsed a #include, lex and /// (potentially) macro expand the filename. void PreprocessorLexer::LexIncludeFilename(Token &FilenameTok) { |