jvikstrom created this revision.
jvikstrom added reviewers: hokein, ilya-biryukov.
Herald added subscribers: cfe-commits, kadircet, arphaman, jkorous, MaskRay.
Herald added a project: clang.

Structured bindings are in a BindingDecl. The decl the declRefExpr points to 
are the BindingDecls. So this adds an additional if statement in the addToken 
function to highlight them. First tries to find the "underlying" decl and 
highlight as that decl (for example, if it's a field it should be highligted as 
a field). If that does not work, it will be highlighted as a variable.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D66738

Files:
  clang-tools-extra/clangd/SemanticHighlighting.cpp
  clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp


Index: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -431,6 +431,23 @@
         assert($Variable[[x]] != $Variable[[y]]);
         assert($Variable[[x]] != $Function[[f]]());
       }
+    )cpp",
+    R"cpp(
+      struct $Class[[S]] {
+        $Primitive[[float]] $Field[[Member]];
+      };
+      $Class[[S]] $Function[[foo]]();
+      $Primitive[[void]] $Function[[f]]() {
+        $Primitive[[int]] $Variable[[A]][2] = {1,2};
+        auto [$Variable[[B1]], $Variable[[B2]]] = $Variable[[A]];
+        auto& [$Variable[[R1]], $Variable[[R2]]] = $Variable[[A]];
+        $Class[[auto]] [$Field[[M1]]] = $Class[[S]]();
+        $Class[[auto]] [$Field[[F1]]] = $Function[[foo]]();
+        $Field[[M1]] += 12.2;
+        $Variable[[B1]] += 2;
+        $Class[[S]] $Variable[[SArr]][2] = {$Class[[S]](), $Class[[S]]()};
+        auto [$Variable[[S1]], $Variable[[S2]]] = $Variable[[SArr]];
+      }
     )cpp"};
   for (const auto &TestCase : TestCases) {
     checkHighlightings(TestCase);
Index: clang-tools-extra/clangd/SemanticHighlighting.cpp
===================================================================
--- clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -229,6 +229,21 @@
       addToken(Loc, HighlightingKind::Variable);
       return;
     }
+    if (const auto *B = dyn_cast<BindingDecl>(D)) {
+      // If we can find the underlying decl and highlight that we should do it.
+      // So first try to find and highlight the underlying NamedDecl for the
+      // binding if one exist.
+      if (const auto *BB = B->getBinding())
+        if (const auto *RD = BB->getReferencedDeclOfCallee())
+          if (const auto *D = dyn_cast<NamedDecl>(RD)) {
+            addToken(Loc, D);
+            return;
+          }
+      // Could not find a more specific decl for this BindingDecl. So just
+      // highlight as a normal variable.
+      addToken(Loc, HighlightingKind::Variable);
+      return;
+    }
     if (isa<FunctionDecl>(D)) {
       addToken(Loc, HighlightingKind::Function);
       return;


Index: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -431,6 +431,23 @@
         assert($Variable[[x]] != $Variable[[y]]);
         assert($Variable[[x]] != $Function[[f]]());
       }
+    )cpp",
+    R"cpp(
+      struct $Class[[S]] {
+        $Primitive[[float]] $Field[[Member]];
+      };
+      $Class[[S]] $Function[[foo]]();
+      $Primitive[[void]] $Function[[f]]() {
+        $Primitive[[int]] $Variable[[A]][2] = {1,2};
+        auto [$Variable[[B1]], $Variable[[B2]]] = $Variable[[A]];
+        auto& [$Variable[[R1]], $Variable[[R2]]] = $Variable[[A]];
+        $Class[[auto]] [$Field[[M1]]] = $Class[[S]]();
+        $Class[[auto]] [$Field[[F1]]] = $Function[[foo]]();
+        $Field[[M1]] += 12.2;
+        $Variable[[B1]] += 2;
+        $Class[[S]] $Variable[[SArr]][2] = {$Class[[S]](), $Class[[S]]()};
+        auto [$Variable[[S1]], $Variable[[S2]]] = $Variable[[SArr]];
+      }
     )cpp"};
   for (const auto &TestCase : TestCases) {
     checkHighlightings(TestCase);
Index: clang-tools-extra/clangd/SemanticHighlighting.cpp
===================================================================
--- clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -229,6 +229,21 @@
       addToken(Loc, HighlightingKind::Variable);
       return;
     }
+    if (const auto *B = dyn_cast<BindingDecl>(D)) {
+      // If we can find the underlying decl and highlight that we should do it.
+      // So first try to find and highlight the underlying NamedDecl for the
+      // binding if one exist.
+      if (const auto *BB = B->getBinding())
+        if (const auto *RD = BB->getReferencedDeclOfCallee())
+          if (const auto *D = dyn_cast<NamedDecl>(RD)) {
+            addToken(Loc, D);
+            return;
+          }
+      // Could not find a more specific decl for this BindingDecl. So just
+      // highlight as a normal variable.
+      addToken(Loc, HighlightingKind::Variable);
+      return;
+    }
     if (isa<FunctionDecl>(D)) {
       addToken(Loc, HighlightingKind::Function);
       return;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to