PTHLexer: Keep track of the location of the last '#' token and provide the means to jump ahead in the token stream.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60905 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/clang/Lex/PTHLexer.h b/include/clang/Lex/PTHLexer.h
index 0ae4ac7..ab49e64 100644
--- a/include/clang/Lex/PTHLexer.h
+++ b/include/clang/Lex/PTHLexer.h
@@ -24,6 +24,14 @@
 class PTHLexer : public PreprocessorLexer {
   /// TokBuf - Buffer from PTH file containing raw token data.
   const char* TokBuf;
+  
+  /// CurPtr - Pointer into current offset of the token buffer where
+  ///  the next token will be read.
+  const char* CurPtr;
+    
+  /// LastHashTokPtr - Pointer into TokBuf of the last processed '#'
+  ///  token that appears at the start of a line.
+  const char* LastHashTokPtr;
 
   PTHLexer(const PTHLexer&);  // DO NOT IMPLEMENT
   void operator=(const PTHLexer&); // DO NOT IMPLEMENT
@@ -72,6 +80,14 @@
 
 private:
   
+  /// SkipToToken - Skip to the token at the specified offset in TokBuf.
+  void SkipToToken(unsigned offset) {
+    const char* NewPtr = TokBuf + offset;
+    assert(NewPtr > CurPtr && "SkipToToken should not go backwards!");
+    NeedsFetching = true;
+    CurPtr = NewPtr;
+  }
+  
   /// AtLastToken - Returns true if the PTHLexer is at the last token.
   bool AtLastToken() { 
     Token T = GetToken();
diff --git a/lib/Lex/PTHLexer.cpp b/lib/Lex/PTHLexer.cpp
index ebbc968..3afbb5b 100644
--- a/lib/Lex/PTHLexer.cpp
+++ b/lib/Lex/PTHLexer.cpp
@@ -28,7 +28,8 @@
 
 PTHLexer::PTHLexer(Preprocessor& pp, SourceLocation fileloc, const char* D,
                    PTHManager& PM)
-  : PreprocessorLexer(&pp, fileloc), TokBuf(D), PTHMgr(PM), 
+  : PreprocessorLexer(&pp, fileloc), TokBuf(D), CurPtr(D), LastHashTokPtr(0),
+    PTHMgr(PM),
     NeedsFetching(true) {
     // Make sure the EofToken is completely clean.
     EofToken.startToken();
@@ -82,6 +83,8 @@
     
   if (Tok.is(tok::hash)) {    
     if (Tok.isAtStartOfLine() && !LexingRawMode) {
+      LastHashTokPtr = CurPtr;
+      
       PP->HandleDirective(Tok);
 
       if (PP->isCurrentLexer(this))
@@ -163,20 +166,20 @@
   T.startToken();
   
   // Read the type of the token.
-  T.setKind((tok::TokenKind) Read8(TokBuf));
+  T.setKind((tok::TokenKind) Read8(CurPtr));
   
   // Set flags.  This is gross, since we are really setting multiple flags.
-  T.setFlag((Token::TokenFlags) Read8(TokBuf));
+  T.setFlag((Token::TokenFlags) Read8(CurPtr));
   
   // Set the IdentifierInfo* (if any).
-  T.setIdentifierInfo(PTHMgr.ReadIdentifierInfo(TokBuf));
+  T.setIdentifierInfo(PTHMgr.ReadIdentifierInfo(CurPtr));
   
   // Set the SourceLocation.  Since all tokens are constructed using a
   // raw lexer, they will all be offseted from the same FileID.
-  T.setLocation(SourceLocation::getFileLoc(FileID, Read32(TokBuf)));
+  T.setLocation(SourceLocation::getFileLoc(FileID, Read32(CurPtr)));
   
   // Finally, read and set the length of the token.
-  T.setLength(Read32(TokBuf));
+  T.setLength(Read32(CurPtr));
 }
 
 //===----------------------------------------------------------------------===//