diff --git a/clang-tools-extra/clangd/FindSymbols.cpp b/clang-tools-extra/clangd/FindSymbols.cpp --- a/clang-tools-extra/clangd/FindSymbols.cpp +++ b/clang-tools-extra/clangd/FindSymbols.cpp @@ -76,20 +76,26 @@ FuzzyFindRequest Req; Req.Query = std::string(Names.second); - // FuzzyFind doesn't want leading :: qualifier - bool IsGlobalQuery = Names.first.consume_front("::"); - // Restrict results to the scope in the query string if present (global or - // not). - if (IsGlobalQuery || !Names.first.empty()) + // FuzzyFind doesn't want leading :: qualifier. Also limit the query to + // specific namespace if it is fully-qualified. + Req.AnyScope = !Names.first.consume_front("::"); + // Boost symbols from desired namespace. + if (!Req.AnyScope || !Names.first.empty()) Req.Scopes = {std::string(Names.first)}; - else - Req.AnyScope = true; if (Limit) Req.Limit = Limit; TopN Top( Req.Limit ? *Req.Limit : std::numeric_limits::max()); FuzzyMatcher Filter(Req.Query); - Index->fuzzyFind(Req, [HintPath, &Top, &Filter](const Symbol &Sym) { + Index->fuzzyFind(Req, [HintPath, &Top, &Filter, &Names](const Symbol &Sym) { + std::string Scope = std::string(Sym.Scope); + llvm::StringRef ScopeRef = Scope; + // Fuzzfind might return symbols from irrelevant namespaces if query was not + // fully-qualified, drop those. + if (!ScopeRef.contains(Names.first)) + return; + ScopeRef.consume_back("::"); + auto Loc = symbolToLocation(Sym, HintPath); if (!Loc) { log("Workspace symbols: {0}", Loc.takeError()); @@ -97,9 +103,6 @@ } SymbolKind SK = indexSymbolKindToSymbolKind(Sym.SymInfo.Kind); - std::string Scope = std::string(Sym.Scope); - llvm::StringRef ScopeRef = Scope; - ScopeRef.consume_back("::"); SymbolInformation Info = {(Sym.Name + Sym.TemplateSpecializationArgs).str(), SK, *Loc, std::string(ScopeRef)}; diff --git a/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp b/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp --- a/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp +++ b/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp @@ -141,7 +141,10 @@ EXPECT_THAT(getSymbols(TU, "::"), ElementsAre(QName("ans1"))); EXPECT_THAT(getSymbols(TU, "::a"), ElementsAre(QName("ans1"))); EXPECT_THAT(getSymbols(TU, "ans1::"), - UnorderedElementsAre(QName("ans1::ai1"), QName("ans1::ans2"))); + UnorderedElementsAre(QName("ans1::ai1"), QName("ans1::ans2"), + QName("ans1::ans2::ai2"))); + EXPECT_THAT(getSymbols(TU, "ans2::"), + UnorderedElementsAre(QName("ans1::ans2::ai2"))); EXPECT_THAT(getSymbols(TU, "::ans1"), ElementsAre(QName("ans1"))); EXPECT_THAT(getSymbols(TU, "::ans1::"), UnorderedElementsAre(QName("ans1::ai1"), QName("ans1::ans2")));