[PATCH] D63559: [clangd] Added functionality for getting semantic highlights for variable and function declarations

Haojian Wu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 26 01:46:39 PDT 2019


hokein added a comment.

much clearer now, a few more nits.



================
Comment at: clang-tools-extra/clangd/ClangdUnit.cpp:69
   bool HandleTopLevelDecl(DeclGroupRef DG) override {
+    //FIXME: There is an edge case where this will still get decls from include files.
     for (Decl *D : DG) {
----------------
not need to add this in this patch as you are also working on a fix in a separate patch.


================
Comment at: clang-tools-extra/clangd/SemanticHighlight.cpp:56
+
+    auto R = getTokenRange(SM, Ctx.getLangOpts(), D->getLocation());
+    if (!R.hasValue()) {
----------------
jvikstrom wrote:
> hokein wrote:
> > How about pulling out a function `llvm::Optional<SemanticToken> makeSemanticToken(..)`?
> Don't understand what you mean.
I meant we could move lines 56 ~ 66 to a new function, the current implementation is fine (as `addToken` is small).


================
Comment at: clang-tools-extra/clangd/SemanticHighlight.cpp:51
+
+    if (D->getDeclName().isEmpty()) {
+      // Don't add symbols that don't have any length.
----------------
nit: remove the `{}` if the body contains only one statement, the same to other places.


================
Comment at: clang-tools-extra/clangd/SemanticHighlight.cpp:57
+    auto R = getTokenRange(SM, Ctx.getLangOpts(), D->getLocation());
+    if (!R.hasValue()) {
+      // R should always have a value, if it doesn't something is very wrong.
----------------
nit: just "if (!R)" would work.


================
Comment at: clang-tools-extra/clangd/SemanticHighlight.cpp:64
+    SemanticToken S;
+    S.R = R.getValue();
+    S.Kind = Kind;
----------------
maybe just `Tokens.emplace_back(Kind, *R)`.


================
Comment at: clang-tools-extra/clangd/SemanticHighlight.cpp:75
+}
+bool operator!=(const SemanticToken &Lhs, const SemanticToken &Rhs) {
+  return !(Lhs == Rhs);
----------------
we probably don't need the `!=` operator in this patch.


================
Comment at: clang-tools-extra/clangd/SemanticHighlight.h:13
+#include "ClangdUnit.h"
+#include "clang/AST/RecursiveASTVisitor.h"
+
----------------
the RecursiveASTVisitor.h should be in the .cpp file.


================
Comment at: clang-tools-extra/clangd/SemanticHighlight.h:32
+
+std::vector<SemanticToken> getSemanticHighlights(ParsedAST &AST);
+
----------------
needs high-level comments.


================
Comment at: clang-tools-extra/clangd/unittests/SemanticHighlightTests.cpp:24
+
+std::vector<SemanticToken> makeSemanticTokens(std::vector<Range> Ranges,
+                                             SemanticHighlightKind Kind) {
----------------
jvikstrom wrote:
> hokein wrote:
> > we are passing a copy here, use llvm::ArrayRef.
> I changed to pass a const vector & instead. Is that alright as well?
yeah, that works as well, llvm prefers `llvm::ArrayRef`, but up to you.


================
Comment at: clang-tools-extra/clangd/unittests/SemanticHighlightTests.cpp:47
+TEST(SemanticTokenCollector, GetsCorrectTokens) {
+  const char *TestCases[] = {
+      R"cpp(
----------------
the code seems not clang-format, could you run clang-format on your patch?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D63559/new/

https://reviews.llvm.org/D63559





More information about the cfe-commits mailing list