[PATCH] D42913: [clangd] Fix incorrect file path for symbols defined by the compile command-line option.

Haojian Wu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Feb 5 09:00:59 PST 2018


hokein created this revision.
hokein added a reviewer: ioeric.
Herald added subscribers: jkorous-apple, ilya-biryukov, klimek.




Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D42913

Files:
  clangd/index/SymbolCollector.cpp
  unittests/clangd/SymbolCollectorTests.cpp


Index: unittests/clangd/SymbolCollectorTests.cpp
===================================================================
--- unittests/clangd/SymbolCollectorTests.cpp
+++ unittests/clangd/SymbolCollectorTests.cpp
@@ -82,16 +82,20 @@
 
 class SymbolCollectorTest : public ::testing::Test {
 public:
-  bool runSymbolCollector(StringRef HeaderCode, StringRef MainCode) {
+  bool runSymbolCollector(StringRef HeaderCode, StringRef MainCode,
+                          const std::vector<std::string> &ExtraArgs = {}) {
     llvm::IntrusiveRefCntPtr<vfs::InMemoryFileSystem> InMemoryFileSystem(
         new vfs::InMemoryFileSystem);
     llvm::IntrusiveRefCntPtr<FileManager> Files(
         new FileManager(FileSystemOptions(), InMemoryFileSystem));
 
     auto Factory = llvm::make_unique<SymbolIndexActionFactory>(CollectorOpts);
 
+    std::vector<std::string> Args = {"symbol_collector", "-fsyntax-only",
+                                     "-std=c++11", TestFileName};
+    Args.insert(Args.end(), ExtraArgs.begin(), ExtraArgs.end());
     tooling::ToolInvocation Invocation(
-        {"symbol_collector", "-fsyntax-only", "-std=c++11", TestFileName},
+        Args,
         Factory->create(), Files.get(),
         std::make_shared<PCHContainerOperations>());
 
@@ -264,6 +268,24 @@
                         CPath(TestFileName))));
 }
 
+TEST_F(SymbolCollectorTest, SymbolFormedByCLI) {
+  CollectorOpts.IndexMainFiles = false;
+
+  Annotations Header(R"(
+    #ifdef NAME
+    $expansion[[class NAME {}]];
+    #endif
+  )");
+
+  runSymbolCollector(Header.code(), /*Main=*/"",
+                     /*ExtraArgs=*/{"-DNAME=name"});
+  EXPECT_THAT(Symbols,
+              UnorderedElementsAre(
+                  AllOf(QName("name"),
+                        LocationOffsets(Header.offsetRange("expansion")),
+                        CPath(TestHeaderName))));
+}
+
 TEST_F(SymbolCollectorTest, IgnoreSymbolsInMainFile) {
   CollectorOpts.IndexMainFiles = false;
   const std::string Header = R"(
Index: clangd/index/SymbolCollector.cpp
===================================================================
--- clangd/index/SymbolCollector.cpp
+++ clangd/index/SymbolCollector.cpp
@@ -124,10 +124,15 @@
 
   SourceLocation Loc = SM.getSpellingLoc(D->getLocation());
   if (D->getLocation().isMacroID()) {
-    // The symbol is formed via macro concatenation, the spelling location will
-    // be "<scratch space>", which is not interesting to us, use the expansion
-    // location instead.
-    if (llvm::StringRef(Loc.printToString(SM)).startswith("<scratch")) {
+    // We use the expansion location for the following symbols, as spelling
+    // locations of these symbols are not interesting to us:
+    //   * symbols formed via macro concatenation, the spelling location will
+    //     be "<scratch space>"
+    //   * symbols controlled and defined by a compile command-line option
+    //     `-DName=foo`, the spelling location will be "<commandline>".
+    std::string PrintLoc = Loc.printToString(SM);
+    if (llvm::StringRef(PrintLoc).startswith("<scratch") ||
+        llvm::StringRef(PrintLoc).startswith("<command line>")) {
       FilePathStorage = makeAbsolutePath(
           SM, SM.getFilename(SM.getExpansionLoc(D->getLocation())),
           FallbackDir);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D42913.132842.patch
Type: text/x-patch
Size: 3281 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180205/7e1c7fed/attachment.bin>


More information about the cfe-commits mailing list