Index: clang-tools-extra/trunk/include-fixer/SymbolIndexManager.cpp =================================================================== --- clang-tools-extra/trunk/include-fixer/SymbolIndexManager.cpp +++ clang-tools-extra/trunk/include-fixer/SymbolIndexManager.cpp @@ -24,6 +24,12 @@ llvm::SmallVector 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: clang-tools-extra/trunk/unittests/include-fixer/IncludeFixerTest.cpp =================================================================== --- clang-tools-extra/trunk/unittests/include-fixer/IncludeFixerTest.cpp +++ clang-tools-extra/trunk/unittests/include-fixer/IncludeFixerTest.cpp @@ -103,6 +103,12 @@ // too. EXPECT_EQ("#include \n\nstring foo;\n", runIncludeFixer("string foo;\n")); + + // Fully qualified name. + EXPECT_EQ("#include \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) {