]> granicus.if.org Git - clang/commitdiff
When creating raw tokens for the PTHLexer specially handle angled strings for #includ...
authorTed Kremenek <kremenek@apple.com>
Fri, 21 Nov 2008 19:41:29 +0000 (19:41 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 21 Nov 2008 19:41:29 +0000 (19:41 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59840 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Lex/PPLexerChange.cpp

index a12309a7bfccce97c6e02437eb47399e37e7fde2..da877493a0f2a2fde89f49d99ae15ea3fbde5c0b 100644 (file)
@@ -90,18 +90,42 @@ void Preprocessor::EnterSourceFile(unsigned FileID,
   
   // Lex the file, populating our data structures.
   std::vector<Token>* Tokens = new std::vector<Token>();
-  Token Tok;  
+  Token Tok;
   
   do {
     L.LexFromRawLexer(Tok);
     
-    if (Tok.is(tok::identifier))
+    if (Tok.is(tok::identifier)) {
       Tok.setIdentifierInfo(LookUpIdentifierInfo(Tok));
-    
-    // Store the token.
-    Tokens->push_back(Tok);
+    }
+    else if (Tok.is(tok::hash) && Tok.isAtStartOfLine()) {
+      // Special processing for #include.  Store the '#' token and lex
+      // the next token.
+      Tokens->push_back(Tok);
+      L.LexFromRawLexer(Tok);
+      
+      // Did we see 'include'/'import'/'include_next'?
+      if (!Tok.is(tok::identifier))
+        continue;
+
+      IdentifierInfo* II = LookUpIdentifierInfo(Tok);
+      Tok.setIdentifierInfo(II);
+      tok::PPKeywordKind K = II->getPPKeywordID();
+      
+      if (K == tok::pp_include || K == tok::pp_import || 
+          K == tok::pp_include_next) {
+        
+        // Save the 'include' token.
+        Tokens->push_back(Tok);
+        
+        // Lex the next token as an include string.
+        L.ParsingPreprocessorDirective = true;
+        L.LexIncludeFilename(Tok); 
+        L.ParsingPreprocessorDirective = false;
+      }
+    }    
   }
-  while (Tok.isNot(tok::eof));
+  while (Tokens->push_back(Tok), Tok.isNot(tok::eof));
   
   if (CurPPLexer || CurTokenLexer)
     PushIncludeMacroStack();