[PATCH] D52357: [clangd] Force Dex to respect symbol collector flags
Kirill Bobyrev via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 21 06:33:27 PDT 2018
kbobyrev created this revision.
kbobyrev added a reviewer: ioeric.
kbobyrev added a project: clang-tools-extra.
Herald added subscribers: kadircet, arphaman, jkorous, MaskRay.
`Dex` should utilize `FuzzyFindRequest.RestrictForCodeCompletion` flags and omit symbols not meant for code completion when asked for it.
Results show that the average query time did not change significantly. Although, it might be faster/cleaner to have a single token and implement `NOT` iterator to append it on top smaller posting list.
| | Before, ns | After, ns | Relative difference |
| -------------------------------------------------------------------------- | ---------- | --------- | ------------------- |
| Cumulative query latency (7000 `FuzzyFindRequest`s over LLVM static index) | 7270930798 | 7282297568 | +0.0015 |
https://reviews.llvm.org/D52357
Files:
clang-tools-extra/clangd/index/dex/Dex.cpp
clang-tools-extra/unittests/clangd/DexTests.cpp
Index: clang-tools-extra/unittests/clangd/DexTests.cpp
===================================================================
--- clang-tools-extra/unittests/clangd/DexTests.cpp
+++ clang-tools-extra/unittests/clangd/DexTests.cpp
@@ -583,6 +583,23 @@
EXPECT_THAT(lookup(*I, SymbolID("ns::nonono")), UnorderedElementsAre());
}
+TEST(DexTest, SymbolIndexOptionsFilter) {
+ auto CodeCompletionSymbol = symbol("Completion");
+ auto NonCodeCompletionSymbol = symbol("NoCompletion");
+ std::vector<Symbol> Symbols{CodeCompletionSymbol, NonCodeCompletionSymbol};
+ Dex I(Symbols, URISchemes);
+ FuzzyFindRequest Req;
+ EXPECT_THAT(match(I, Req), ElementsAre("Completion", "NoCompletion"));
+ CodeCompletionSymbol.Flags = Symbol::SymbolFlag::IndexedForCodeCompletion;
+ NonCodeCompletionSymbol.Flags = Symbol::SymbolFlag::None;
+ Symbols = {CodeCompletionSymbol, NonCodeCompletionSymbol};
+ I = Dex(Symbols, URISchemes);
+ Req.RestrictForCodeCompletion = true;
+ EXPECT_THAT(match(I, Req), ElementsAre("Completion"));
+ Req.RestrictForCodeCompletion = false;
+ EXPECT_THAT(match(I, Req), ElementsAre("NoCompletion"));
+}
+
TEST(DexTest, ProximityPathsBoosting) {
auto RootSymbol = symbol("root::abc");
RootSymbol.CanonicalDeclaration.FileURI = "unittest:///file.h";
Index: clang-tools-extra/clangd/index/dex/Dex.cpp
===================================================================
--- clang-tools-extra/clangd/index/dex/Dex.cpp
+++ clang-tools-extra/clangd/index/dex/Dex.cpp
@@ -22,6 +22,11 @@
namespace {
+static const Token RestrictedForCodeCompletion =
+ Token(Token::Kind::Sentinel, "Restricted For Code Completion");
+static const Token NotRestrictedForCodeCompletion =
+ Token(Token::Kind::Sentinel, "Not 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 +44,9 @@
for (const auto &ProximityURI :
generateProximityURIs(Sym.CanonicalDeclaration.FileURI))
Result.emplace_back(Token::Kind::ProximityURI, ProximityURI);
+ Result.emplace_back(Sym.Flags & Symbol::IndexedForCodeCompletion
+ ? RestrictedForCodeCompletion
+ : NotRestrictedForCodeCompletion);
return Result;
}
@@ -119,7 +127,6 @@
for (const auto &Token : generateSearchTokens(*Sym))
TempInvertedIndex[Token].push_back(SymbolRank);
}
-
// Convert lists of items to posting lists.
for (const auto &TokenToPostingList : TempInvertedIndex)
InvertedIndex.insert({TokenToPostingList.first,
@@ -175,6 +182,13 @@
TopLevelChildren.push_back(createOr(move(BoostingIterators)));
}
+ // Filter symbols which are (not) indexed for code completion.
+ TopLevelChildren.push_back(InvertedIndex
+ .find(Req.RestrictForCodeCompletion
+ ? RestrictedForCodeCompletion
+ : NotRestrictedForCodeCompletion)
+ ->second.iterator());
+
// Use TRUE iterator if both trigrams and scopes from the query are not
// present in the symbol index.
auto QueryIterator = TopLevelChildren.empty()
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D52357.166468.patch
Type: text/x-patch
Size: 3357 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180921/74e477f6/attachment.bin>
More information about the cfe-commits
mailing list