]> granicus.if.org Git - clang/commitdiff
Move some diagnostic handling to PreprocessorLexer.
authorTed Kremenek <kremenek@apple.com>
Wed, 12 Nov 2008 23:13:54 +0000 (23:13 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 12 Nov 2008 23:13:54 +0000 (23:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59191 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Lex/Lexer.h
include/clang/Lex/PTHLexer.h
include/clang/Lex/PreprocessorLexer.h
lib/Lex/Lexer.cpp
lib/Lex/PTHLexer.cpp
lib/Lex/PreprocessorLexer.cpp

index f3f8c739cf328f3c980f9ec9a395a815a1a0813a..3542ff4bc7214a1c2181551cd6ea7c4440b7aad7 100644 (file)
@@ -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.
index cdca3419a23c67856f1ec7c80625401a92276dac..2985b24cb5c5b53733ce54c7d873d1bd01d3e40f 100644 (file)
 namespace clang {
   
 class PTHLexer : public PreprocessorLexer {
-
-  /// PP - Preprocessor.
-  Preprocessor& PP;
-  
   /// FileLoc - Location for the start of the file.
   ///
   SourceLocation FileLoc;
index bbe6dbeeac5ced3c47c62a96bdcabf66951afed8..de9c6b780a0c1fd5631626b9e93f892c16e03fdc 100644 (file)
 #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.
index b71452bc52e52820cc091fc7555778daa4672f2d..4e93600a87763b13854f833dc64412df4765bd55 100644 (file)
@@ -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();
   }
   
index e1b392068c00864f71b87ded45ef4f7b12e0f4ef..b0ecb270d9d8edeaeea6370fd076ee464f54c0dc 100644 (file)
@@ -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;
   }
     
index f3d91af4ed11ef498368c01fdc282f9bcadd30ca..3c5d81b8a7128002d2c394daca4bb1a2bf1569c2 100644 (file)
@@ -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) {