Index: clang-tools-extra/trunk/clangd/index/dex/Dex.cpp =================================================================== --- clang-tools-extra/trunk/clangd/index/dex/Dex.cpp +++ clang-tools-extra/trunk/clangd/index/dex/Dex.cpp @@ -22,6 +22,10 @@ namespace { +// Mark symbols which are can be used for code completion. +static const Token RestrictedForCodeCompletion = + Token(Token::Kind::Sentinel, "Restricted For Code Completion"); + // Returns the tokens which are given symbol's characteristics. Currently, the // generated tokens only contain fuzzy matching trigrams and symbol's scope, // but in the future this will also return path proximity tokens and other @@ -39,6 +43,8 @@ for (const auto &ProximityURI : generateProximityURIs(Sym.CanonicalDeclaration.FileURI)) Result.emplace_back(Token::Kind::ProximityURI, ProximityURI); + if (Sym.Flags & Symbol::IndexedForCodeCompletion) + Result.emplace_back(RestrictedForCodeCompletion); return Result; } @@ -175,6 +181,10 @@ TopLevelChildren.push_back(createOr(move(BoostingIterators))); } + if (Req.RestrictForCodeCompletion) + TopLevelChildren.push_back( + InvertedIndex.find(RestrictedForCodeCompletion)->second.iterator()); + // Use TRUE iterator if both trigrams and scopes from the query are not // present in the symbol index. auto QueryIterator = TopLevelChildren.empty() Index: clang-tools-extra/trunk/unittests/clangd/DexTests.cpp =================================================================== --- clang-tools-extra/trunk/unittests/clangd/DexTests.cpp +++ clang-tools-extra/trunk/unittests/clangd/DexTests.cpp @@ -583,6 +583,20 @@ EXPECT_THAT(lookup(*I, SymbolID("ns::nonono")), UnorderedElementsAre()); } +TEST(DexTest, SymbolIndexOptionsFilter) { + auto CodeCompletionSymbol = symbol("Completion"); + auto NonCodeCompletionSymbol = symbol("NoCompletion"); + CodeCompletionSymbol.Flags = Symbol::SymbolFlag::IndexedForCodeCompletion; + NonCodeCompletionSymbol.Flags = Symbol::SymbolFlag::None; + std::vector Symbols{CodeCompletionSymbol, NonCodeCompletionSymbol}; + Dex I(Symbols, URISchemes); + FuzzyFindRequest Req; + Req.RestrictForCodeCompletion = false; + EXPECT_THAT(match(I, Req), ElementsAre("Completion", "NoCompletion")); + Req.RestrictForCodeCompletion = true; + EXPECT_THAT(match(I, Req), ElementsAre("Completion")); +} + TEST(DexTest, ProximityPathsBoosting) { auto RootSymbol = symbol("root::abc"); RootSymbol.CanonicalDeclaration.FileURI = "unittest:///file.h";