bkramer created this revision. bkramer added reviewers: hokein, ioeric. bkramer added a subscriber: cfe-commits.
If a search string starts with "::" we don't want to return any results for suffixes of that string. http://reviews.llvm.org/D20424 Files: include-fixer/SymbolIndexManager.cpp unittests/include-fixer/IncludeFixerTest.cpp Index: unittests/include-fixer/IncludeFixerTest.cpp =================================================================== --- unittests/include-fixer/IncludeFixerTest.cpp +++ unittests/include-fixer/IncludeFixerTest.cpp @@ -103,6 +103,12 @@ // too. EXPECT_EQ("#include <string>\n\nstring foo;\n", runIncludeFixer("string foo;\n")); + + // Fully qualified name. + EXPECT_EQ("#include <string>\n\n::std::string foo;\n", + runIncludeFixer("::std::string foo;\n")); + // Should not match std::string. + EXPECT_EQ("::string foo;\n", runIncludeFixer("::string foo;\n")); } TEST(IncludeFixer, IncompleteType) { Index: include-fixer/SymbolIndexManager.cpp =================================================================== --- include-fixer/SymbolIndexManager.cpp +++ include-fixer/SymbolIndexManager.cpp @@ -24,6 +24,12 @@ llvm::SmallVector<llvm::StringRef, 8> Names; Identifier.split(Names, "::"); + bool IsFullyQualified = false; + if (Identifier.startswith("::")) { + Names.erase(Names.begin()); // Drop first (empty) element. + IsFullyQualified = true; + } + // As long as we don't find a result keep stripping name parts from the end. // 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 @@ -61,6 +67,11 @@ } } + // If the name was qualified we only want to add results if we evaluated + // all contexts. + if (IsFullyQualified) + IsMatched &= SymbolContext == Symbol.getContexts().end(); + // 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()) {
Index: unittests/include-fixer/IncludeFixerTest.cpp =================================================================== --- unittests/include-fixer/IncludeFixerTest.cpp +++ unittests/include-fixer/IncludeFixerTest.cpp @@ -103,6 +103,12 @@ // too. EXPECT_EQ("#include <string>\n\nstring foo;\n", runIncludeFixer("string foo;\n")); + + // Fully qualified name. + EXPECT_EQ("#include <string>\n\n::std::string foo;\n", + runIncludeFixer("::std::string foo;\n")); + // Should not match std::string. + EXPECT_EQ("::string foo;\n", runIncludeFixer("::string foo;\n")); } TEST(IncludeFixer, IncompleteType) { Index: include-fixer/SymbolIndexManager.cpp =================================================================== --- include-fixer/SymbolIndexManager.cpp +++ include-fixer/SymbolIndexManager.cpp @@ -24,6 +24,12 @@ llvm::SmallVector<llvm::StringRef, 8> Names; Identifier.split(Names, "::"); + bool IsFullyQualified = false; + if (Identifier.startswith("::")) { + Names.erase(Names.begin()); // Drop first (empty) element. + IsFullyQualified = true; + } + // As long as we don't find a result keep stripping name parts from the end. // 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 @@ -61,6 +67,11 @@ } } + // If the name was qualified we only want to add results if we evaluated + // all contexts. + if (IsFullyQualified) + IsMatched &= SymbolContext == Symbol.getContexts().end(); + // 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()) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits