[PATCH] D42073: [clangd] Query all visible scopes based on all visible using-namespace declarationsand containing namespace for global qualified code completion.

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 16 03:36:30 PST 2018


sammccall added a comment.

Sounds like implementation is in flux, but a few comments that might be relevant.



================
Comment at: clangd/CodeComplete.cpp:264
+/// (e.g. "ns::ab?").
+struct QueryScopes {
+  /// All scopes being queried in indexes. Each scope should meet the
----------------
this could also be just a using, rather than a struct - do you see more members here?


================
Comment at: clangd/CodeComplete.cpp:270
+  /// namespace scopes which are visible to the qualified-id completion token.
+  std::vector<std::string> Scopes;
+};
----------------
Just to check, if the user types:
"vec" --> None
"::vec" --> {""}
"std::vec" --> {"std"}
"using namespace std; vec" --> None
"using namespace std; ::vec" --> {"", "std"}

is this right?


================
Comment at: clangd/CodeComplete.cpp:300
   /// This is set if the completion is for qualified IDs, e.g. "abc::x^".
-  llvm::Optional<SpecifiedScope> SSInfo;
+  llvm::Optional<QueryScopes> QScopes;
 };
----------------
Probably not for this patch, but I just realized...

Currently if the completion is not qualified, we don't track what namespaces are in scope.
This is really relevant for ranking though.
e.g. "using namespace std; namespace foo { v^ }"
The index should apply namespace-based bonuses: foo::value > std::vector > boost::variant.
At the moment we don't provide enough information to do this. But this optional<QueryScopes> probably wants to be a QueryScopes + bool Qualified, or two QueryScopes (one for restrictions, and one for scoring)

So I'd suggest either here or in queryscopes:
    // TODO: for unqualified completions, capture scopes and use for scoring.


================
Comment at: clangd/CodeComplete.cpp:658
+    VisibleNamespaceFinder Finder;
+    S.LookupVisibleDecls(QCC.ClosestScope,
+                         clang::Sema::LookupNameKind::LookupOrdinaryName,
----------------
you need to set loadexternal to false to avoid deserializing the whole preamble.
Ilya says this is going to get merged with lookup during code-completion, which would be nice :-)


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D42073





More information about the cfe-commits mailing list