Per discussion in http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20120917...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 27 Sep 2012 01:42:07 +0000 (01:42 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 27 Sep 2012 01:42:07 +0000 (01:42 +0000)
have PPCallbacks::InclusionDirective pass the character range for the filename quotes or brackets.

rdar://11113134 & http://llvm.org/PR13880

llvm-svn: 164743

clang/include/clang/Lex/PPCallbacks.h
clang/include/clang/Lex/PreprocessingRecord.h
clang/lib/Frontend/DependencyFile.cpp
clang/lib/Frontend/DependencyGraph.cpp
clang/lib/Lex/PPDirectives.cpp
clang/lib/Lex/PreprocessingRecord.cpp
clang/lib/Rewrite/Frontend/InclusionRewriter.cpp
clang/test/FixIt/fixit-include.c
clang/tools/libclang/Indexing.cpp

index 962b4df..ec63ff3 100644 (file)
@@ -93,6 +93,9 @@ public:
   /// \param IsAngled Whether the file name was enclosed in angle brackets;
   /// otherwise, it was enclosed in quotes.
   ///
+  /// \param FilenameRange The character range of the quotes or angle brackets
+  /// for the written file name.
+  ///
   /// \param File The actual file that may be included by this inclusion 
   /// directive.
   ///
@@ -114,8 +117,8 @@ public:
                                   const Token &IncludeTok,
                                   StringRef FileName,
                                   bool IsAngled,
+                                  CharSourceRange FilenameRange,
                                   const FileEntry *File,
-                                  SourceLocation EndLoc,
                                   StringRef SearchPath,
                                   StringRef RelativePath) {
   }
@@ -266,14 +269,14 @@ public:
                                   const Token &IncludeTok,
                                   StringRef FileName,
                                   bool IsAngled,
+                                  CharSourceRange FilenameRange,
                                   const FileEntry *File,
-                                  SourceLocation EndLoc,
                                   StringRef SearchPath,
                                   StringRef RelativePath) {
-    First->InclusionDirective(HashLoc, IncludeTok, FileName, IsAngled, File,
-                              EndLoc, SearchPath, RelativePath);
-    Second->InclusionDirective(HashLoc, IncludeTok, FileName, IsAngled, File,
-                               EndLoc, SearchPath, RelativePath);
+    First->InclusionDirective(HashLoc, IncludeTok, FileName, IsAngled,
+                              FilenameRange, File, SearchPath, RelativePath);
+    Second->InclusionDirective(HashLoc, IncludeTok, FileName, IsAngled,
+                               FilenameRange, File, SearchPath, RelativePath);
   }
 
   virtual void EndOfMainFile() {
index 4fd4345..ffff04d 100644 (file)
@@ -597,8 +597,8 @@ namespace clang {
                                     const Token &IncludeTok,
                                     StringRef FileName,
                                     bool IsAngled,
+                                    CharSourceRange FilenameRange,
                                     const FileEntry *File,
-                                    SourceLocation EndLoc,
                                     StringRef SearchPath,
                                     StringRef RelativePath);
     virtual void If(SourceLocation Loc, SourceRange ConditionRange);
index 21f5daa..adc9660 100644 (file)
@@ -59,8 +59,8 @@ public:
                                   const Token &IncludeTok,
                                   StringRef FileName,
                                   bool IsAngled,
+                                  CharSourceRange FilenameRange,
                                   const FileEntry *File,
-                                  SourceLocation EndLoc,
                                   StringRef SearchPath,
                                   StringRef RelativePath);
 
@@ -132,8 +132,8 @@ void DependencyFileCallback::InclusionDirective(SourceLocation HashLoc,
                                                 const Token &IncludeTok,
                                                 StringRef FileName,
                                                 bool IsAngled,
+                                                CharSourceRange FilenameRange,
                                                 const FileEntry *File,
-                                                SourceLocation EndLoc,
                                                 StringRef SearchPath,
                                                 StringRef RelativePath) {
   if (!File) {
index eebaf0c..7fb4ad7 100644 (file)
@@ -51,8 +51,8 @@ public:
                                   const Token &IncludeTok,
                                   StringRef FileName,
                                   bool IsAngled,
+                                  CharSourceRange FilenameRange,
                                   const FileEntry *File,
-                                  SourceLocation EndLoc,
                                   StringRef SearchPath,
                                   StringRef RelativePath);
 
@@ -72,8 +72,8 @@ void DependencyGraphCallback::InclusionDirective(SourceLocation HashLoc,
                                                  const Token &IncludeTok,
                                                  StringRef FileName,
                                                  bool IsAngled,
+                                                 CharSourceRange FilenameRange,
                                                  const FileEntry *File,
-                                                 SourceLocation EndLoc,
                                                  StringRef SearchPath,
                                                  StringRef RelativePath) {
   if (!File)
index 70302f1..ccbee63 100644 (file)
@@ -1296,9 +1296,6 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
   case tok::string_literal:
     Filename = getSpelling(FilenameTok, FilenameBuffer);
     End = FilenameTok.getLocation();
-    // For an angled include, point the end location at the closing '>'.
-    if (FilenameTok.is(tok::angle_string_literal))
-      End = End.getLocWithOffset(Filename.size()-1);
     CharEnd = End.getLocWithOffset(Filename.size());
     break;
 
@@ -1388,8 +1385,9 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
     }
     
     // Notify the callback object that we've seen an inclusion directive.
-    Callbacks->InclusionDirective(HashLoc, IncludeTok, Filename, isAngled, File,
-                                  End, SearchPath, RelativePath);
+    Callbacks->InclusionDirective(HashLoc, IncludeTok, Filename, isAngled,
+              CharSourceRange::getCharRange(FilenameTok.getLocation(), CharEnd),
+                                  File, SearchPath, RelativePath);
   }
   
   if (File == 0) {
index dfdeba3..40250f6 100644 (file)
@@ -389,8 +389,8 @@ void PreprocessingRecord::InclusionDirective(
     const clang::Token &IncludeTok,
     StringRef FileName,
     bool IsAngled,
+    CharSourceRange FilenameRange,
     const FileEntry *File,
-    clang::SourceLocation EndLoc,
     StringRef SearchPath,
     StringRef RelativePath) {
   InclusionDirective::InclusionKind Kind = InclusionDirective::Include;
@@ -415,7 +415,16 @@ void PreprocessingRecord::InclusionDirective(
   default:
     llvm_unreachable("Unknown include directive kind");
   }
-  
+
+  SourceLocation EndLoc;
+  if (!IsAngled) {
+    EndLoc = FilenameRange.getBegin();
+  } else {
+    EndLoc = FilenameRange.getEnd();
+    if (FilenameRange.isCharRange())
+      EndLoc = EndLoc.getLocWithOffset(-1); // the InclusionDirective expects
+                                            // a token range.
+  }
   clang::InclusionDirective *ID
     = new (*this) clang::InclusionDirective(*this, Kind, FileName, !IsAngled, 
                                             File, SourceRange(HashLoc, EndLoc));
index 1929d72..9c3c43b 100644 (file)
@@ -57,8 +57,8 @@ private:
                                   const Token &IncludeTok,
                                   StringRef FileName,
                                   bool IsAngled,
+                                  CharSourceRange FilenameRange,
                                   const FileEntry *File,
-                                  SourceLocation EndLoc,
                                   StringRef SearchPath,
                                   StringRef RelativePath);
   void WriteLineInfo(const char *Filename, int Line,
@@ -152,8 +152,8 @@ void InclusionRewriter::InclusionDirective(SourceLocation HashLoc,
                                            const Token &/*IncludeTok*/,
                                            StringRef /*FileName*/,
                                            bool /*IsAngled*/,
+                                           CharSourceRange /*FilenameRange*/,
                                            const FileEntry * /*File*/,
-                                           SourceLocation /*EndLoc*/,
                                            StringRef /*SearchPath*/,
                                            StringRef /*RelativePath*/) {
   assert(LastInsertedFileChange == FileChanges.end() && "Another inclusion "
index 51bd9b0..383c513 100644 (file)
@@ -3,8 +3,10 @@
 // RUN: cp %S/fixit-include.h %T
 // RUN: not %clang_cc1 -fsyntax-only -fixit %t
 // RUN: %clang_cc1 -Wall -pedantic %t
+// RUN: %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
 
 #include <fixit-include.h> // expected-error {{'fixit-include.h' file not found with <angled> include; use "quotes" instead}}
+// CHECK: fix-it:{{.*}}:{8:10-8:27}
 
 #pragma does_not_exist // expected-warning {{unknown pragma ignored}}
 
index ae52004..7e65483 100644 (file)
@@ -68,8 +68,8 @@ public:
                                   const Token &IncludeTok,
                                   StringRef FileName,
                                   bool IsAngled,
+                                  CharSourceRange FilenameRange,
                                   const FileEntry *File,
-                                  SourceLocation EndLoc,
                                   StringRef SearchPath,
                                   StringRef RelativePath) {
     bool isImport = (IncludeTok.is(tok::identifier) &&