[clang-tools-extra] r271671 - [include-fixer] Be smarter about inserting symbols for a prefix.

Benjamin Kramer via cfe-commits cfe-commits at lists.llvm.org
Fri Jun 3 07:07:38 PDT 2016


Author: d0k
Date: Fri Jun  3 09:07:38 2016
New Revision: 271671

URL: http://llvm.org/viewvc/llvm-project?rev=271671&view=rev
Log:
[include-fixer] Be smarter about inserting symbols for a prefix.

If prefix search finds something where nothing can be nested under (e.g.
a variable or macro) don't add it to the result.

This is for cases like:
header.h:
  extern int a;

file.cc:
namespace a {
  SOME_MACRO
}

We will look up a::SOME_MACRO, which doesn't have any results. Then we
look up 'a' and find something before we ever look up just 'SOME_MACRO'.
With some basic filtering we can avoid this case.

Differential Revision: http://reviews.llvm.org/D20960

Added:
    clang-tools-extra/trunk/test/include-fixer/prefix_variable.cpp
Modified:
    clang-tools-extra/trunk/include-fixer/SymbolIndexManager.cpp
    clang-tools-extra/trunk/test/include-fixer/Inputs/fake_yaml_db.yaml

Modified: clang-tools-extra/trunk/include-fixer/SymbolIndexManager.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/include-fixer/SymbolIndexManager.cpp?rev=271671&r1=271670&r2=271671&view=diff
==============================================================================
--- clang-tools-extra/trunk/include-fixer/SymbolIndexManager.cpp (original)
+++ clang-tools-extra/trunk/include-fixer/SymbolIndexManager.cpp Fri Jun  3 09:07:38 2016
@@ -66,6 +66,7 @@ SymbolIndexManager::search(llvm::StringR
   // This is to support nested classes which aren't recorded in the database.
   // Eventually we will either hit a class (namespaces aren't in the database
   // either) and can report that result.
+  bool TookPrefix = false;
   std::vector<std::string> Results;
   while (Results.empty() && !Names.empty()) {
     std::vector<clang::find_all_symbols::SymbolInfo> Symbols;
@@ -109,6 +110,16 @@ SymbolIndexManager::search(llvm::StringR
         // FIXME: Support full match. At this point, we only find symbols in
         // database which end with the same contexts with the identifier.
         if (IsMatched && IdentiferContext == Names.rend()) {
+          // If we're in a situation where we took a prefix but the thing we
+          // found couldn't possibly have a nested member ignore it.
+          if (TookPrefix &&
+              (Symbol.getSymbolKind() == SymbolInfo::SymbolKind::Function ||
+               Symbol.getSymbolKind() == SymbolInfo::SymbolKind::Variable ||
+               Symbol.getSymbolKind() ==
+                   SymbolInfo::SymbolKind::EnumConstantDecl ||
+               Symbol.getSymbolKind() == SymbolInfo::SymbolKind::Macro))
+            continue;
+
           // FIXME: file path should never be in the form of <...> or "...", but
           // the unit test with fixed database use <...> file path, which might
           // need to be changed.
@@ -122,6 +133,7 @@ SymbolIndexManager::search(llvm::StringR
       }
     }
     Names.pop_back();
+    TookPrefix = true;
   }
 
   return Results;

Modified: clang-tools-extra/trunk/test/include-fixer/Inputs/fake_yaml_db.yaml
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/include-fixer/Inputs/fake_yaml_db.yaml?rev=271671&r1=271670&r2=271671&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/include-fixer/Inputs/fake_yaml_db.yaml (original)
+++ clang-tools-extra/trunk/test/include-fixer/Inputs/fake_yaml_db.yaml Fri Jun  3 09:07:38 2016
@@ -43,3 +43,11 @@ FilePath:        ../include/zbar.h
 LineNumber:      1
 Type:            Class
 NumOccurrences:  3
+---
+Name:           b
+Contexts:
+FilePath:        var.h
+LineNumber:      1
+Type:            Variable
+NumOccurrences:  1
+...

Added: clang-tools-extra/trunk/test/include-fixer/prefix_variable.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/include-fixer/prefix_variable.cpp?rev=271671&view=auto
==============================================================================
--- clang-tools-extra/trunk/test/include-fixer/prefix_variable.cpp (added)
+++ clang-tools-extra/trunk/test/include-fixer/prefix_variable.cpp Fri Jun  3 09:07:38 2016
@@ -0,0 +1,11 @@
+// REQUIRES: shell
+// RUN: sed -e 's#//.*$##' %s > %t.cpp
+// RUN: clang-include-fixer -db=yaml -input=%p/Inputs/fake_yaml_db.yaml %t.cpp --
+// RUN: FileCheck %s -input-file=%t.cpp
+
+// CHECK-NOT: #include
+// CHECK: doesnotexist f;
+
+namespace b {
+doesnotexist f;
+}




More information about the cfe-commits mailing list