[PATCH] D48762: [clangd] codeComplete returns more structured completion items, LSP. NFC.

Eric Liu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Jun 29 05:45:49 PDT 2018


ioeric added a comment.

Looks great! Mostly nits.



================
Comment at: clangd/CodeComplete.cpp:259
+      : ASTCtx(ASTCtx), ExtractDocumentation(Opts.IncludeComments) {
+    if (C.SemaResult) {
+      Completion.Name = llvm::StringRef(SemaCCS->getTypedText());
----------------
nit: shall we keep `assert(bool(SemaResult) == bool(SemaCCS));`?


================
Comment at: clangd/CodeComplete.cpp:279
+    if (auto Inserted = C.headerToInsertIfNotPresent()) {
+      llvm::errs() << "Inserted = " << *Inserted << "\n";
+      Completion.Header = *Inserted;
----------------
remove?


================
Comment at: clangd/CodeComplete.cpp:280
+      llvm::errs() << "Inserted = " << *Inserted << "\n";
+      Completion.Header = *Inserted;
+      // Turn absolute path into a literal string that can be #included.
----------------
`Inserted` can be an absolute path which might have long uninteresting prefix.  It might make sense to use the result from `calculateIncludePath`? 


================
Comment at: clangd/CodeComplete.cpp:309
+
+  void add(const CompletionCandidate &C, CodeCompletionString *SemaCCS) {
+    Bundled.emplace_back();
----------------
nit: It's unclear why `add` is a public interface given that the constructor also adds candidate. Might worth a comment. Also, it seems that the interface design has been driven by by the bundling logic, so it might also make sense to explain a bit on the class level.


================
Comment at: clangd/CodeComplete.cpp:322
+    }
+    if (ExtractDocumentation && Completion.Documentation.empty()) {
+      if (C.IndexResult && C.IndexResult->Detail)
----------------
nit: the documentation for the bundling says `Documentation may contain a combined docstring from all comments`. The implementation seems to take the documentation from the last comment (which seems fine to me), but they should be consistent.


================
Comment at: clangd/CodeComplete.cpp:346
+
+  template <std::string BundledEntry::*Member>
+  const std::string *onlyValue() const {
----------------
nit: this might worth a comment. it's unclear what this does by just looking at the name.


================
Comment at: clangd/CodeComplete.cpp:1145
+    Scores.ExcludingName = Relevance.NameMatch
+                               ? Scores.Total / Relevance.NameMatch
+                               : Scores.Quality;
----------------
nit: this seems to assume that `NameMatch` is a factor of the final score, which seems to be changeable given the abstraction of `evaluateSymbolAndRelevance`. Not sure if there is an alternative to the current approach, but this probably deserves a comment.


================
Comment at: clangd/CodeComplete.cpp:1161
 
-  CompletionItem toCompletionItem(const CompletionCandidate::Bundle &Bundle,
-                                  const CompletionItemScores &Scores) {
-    CodeCompletionString *SemaCCS = nullptr;
-    std::string FrontDocComment;
-    if (auto *SR = Bundle.front().SemaResult) {
-      SemaCCS = Recorder->codeCompletionString(*SR);
-      if (Opts.IncludeComments) {
-        assert(Recorder->CCSema);
-        FrontDocComment = getDocComment(Recorder->CCSema->getASTContext(), *SR,
-                                        /*CommentsFromHeader=*/false);
-      }
+  CodeCompletion toCompletionItem(const CompletionCandidate::Bundle &Bundle) {
+    llvm::Optional<CodeCompletionBuilder> Builder;
----------------
nit: toCompletionItem might be ambiguous now that this returns `CodeCompletion`.


================
Comment at: clangd/CodeComplete.h:88
+  // Qualifiers that must be inserted before the name (e.g. base::).
+  std::string Qualifiers;
+  // Details to be displayed following the name. Not inserted.
----------------
Give that this field has caused confusion before, would it make sense to make the name a bit more concrete like `RequiredQualifier` or `InsertedQualifier`?


================
Comment at: clangd/CodeComplete.h:106
+  unsigned BundleSize;
+  // The header through which this symbol should be included.
+  // Empty for non-symbol completions.
----------------
Would this be an absolute path or an include path?


================
Comment at: clangd/CodeComplete.h:140
+  std::vector<CodeCompletion> Completions;
+  bool More = false;
+};
----------------
I found `Result.More` a bit not straightforward. Maybe `HasMore`?


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D48762





More information about the cfe-commits mailing list