t-troebst updated this revision to Diff 513406.
t-troebst added a comment.

Changed `isConstQualifed()` to the custom `isConst()` (though this `isConst()` 
behaves strangely for pointer types, we should fix this separately and keep 
them synced for now).


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D148284

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
@@ -1154,6 +1154,94 @@
     checkHighlightings(Test, {}, ScopeModifierMask);
 }
 
+TEST(SemanticHighlighting, MemberReadonly) {
+  const char *TestCases[] = {
+      R"cpp(
+        struct $Class[[A]] {
+          int $Field[[x]];
+          const int $Field_readonly[[y]];
+          mutable int $Field[[z]];
+        };
+        void $Function[[foo]](){
+          $Class[[A]] $LocalVariable[[a]]{};
+          $LocalVariable[[a]].$Field[[x]];
+          $LocalVariable[[a]].$Field_readonly[[y]];
+          $LocalVariable[[a]].$Field[[z]];
+          const $Class[[A]] $LocalVariable_readonly[[b]]{};
+          $LocalVariable_readonly[[b]].$Field_readonly[[x]];
+          $LocalVariable_readonly[[b]].$Field_readonly[[y]];
+          $LocalVariable_readonly[[b]].$Field[[z]];
+        }
+      )cpp",
+      R"cpp(
+        struct $Class[[A]] {
+          int $Field[[x]];
+          const int $Field_readonly[[y]];
+          mutable int $Field[[z]];
+        };
+        void $Function[[foo]](){
+          $Class[[A]] *$LocalVariable[[a]] = $Operator[[new]] $Class[[A]]{};
+          $LocalVariable[[a]]->$Field[[x]];
+          $LocalVariable[[a]]->$Field_readonly[[y]];
+          $LocalVariable[[a]]->$Field[[z]];
+          const $Class[[A]] *$LocalVariable_readonly[[b]] = $Operator[[new]] $Class[[A]]{};
+          $LocalVariable_readonly[[b]]->$Field_readonly[[x]];
+          $LocalVariable_readonly[[b]]->$Field_readonly[[y]];
+          $LocalVariable_readonly[[b]]->$Field[[z]];
+        }
+      )cpp",
+      R"cpp(
+        struct $Class[[A]] {
+          int $Field[[x]];
+          const int $Field_readonly[[y]];
+          mutable int $Field[[z]];
+          void $Method_readonly[[foo]]() const {
+            $Field_readonly[[x]];
+            $Field_readonly[[y]];
+            $Field[[z]];
+          }
+          void $Method[[bar]]() {
+            $Field[[x]];
+            $Field_readonly[[y]];
+            $Field[[z]];
+          }
+        };
+      )cpp",
+      R"cpp(
+        struct $Class[[A]] {
+          int $Field[[x]];
+          const int $Field_readonly[[y]];
+          mutable int $Field[[z]];
+          void $Method_readonly[[foo]]() const {
+            this->$Field_readonly[[x]];
+            this->$Field_readonly[[y]];
+            this->$Field[[z]];
+          }
+          void $Method[[bar]]() {
+            this->$Field[[x]];
+            this->$Field_readonly[[y]];
+            this->$Field[[z]];
+          }
+        };
+      )cpp",
+      R"cpp(
+        struct $Class[[A]] {
+          void $Method_readonly[[foo]]() const {}
+          void $Method[[foo]]() {}
+          void $Method_readonly[[test]]() const {
+            $Method_readonly[[foo]]();
+          }
+          void $Method[[test]]() {
+            $Method[[foo]]();
+          }
+        };
+      )cpp",
+  };
+
+  for (const char *Test : TestCases)
+    checkHighlightings(Test, {}, 1 << unsigned(HighlightingModifier::Readonly));
+}
+
 // Ranges are highlighted as variables, unless highlighted as $Function etc.
 std::vector<HighlightingToken> tokens(llvm::StringRef MarkedText) {
   Annotations A(MarkedText);
Index: clang-tools-extra/clangd/SemanticHighlighting.cpp
===================================================================
--- clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -670,8 +670,11 @@
     H.addAngleBracketTokens(E->getLAngleLoc(), E->getRAngleLoc());
     return true;
   }
+
   bool VisitMemberExpr(MemberExpr *E) {
     H.addAngleBracketTokens(E->getLAngleLoc(), E->getRAngleLoc());
+    if (isConst(E->getType()))
+      H.addExtraModifier(E->getMemberLoc(), HighlightingModifier::Readonly);
     return true;
   }
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to