[PATCH] D148284: [clangd] Add "readonly" token to const member expressions

2023-04-13 Thread Thorben Tröbst via Phabricator via cfe-commits
t-troebst created this revision.
t-troebst added a reviewer: nridge.
t-troebst added a project: clang-tools-extra.
Herald added subscribers: kadircet, arphaman.
Herald added a project: All.
t-troebst requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov.

In semantic highlighting: this adds the readonly token to `a` in an member 
expression of the form`a` (implicit this), `(...).a` or `(...)->a` if `a` is 
const in this context. Previously, only the type of the declaration of `a` was 
considered.


Repository:
  rG LLVM Github Monorepo

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 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 (E->getType().isConstQualified())
+  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


[PATCH] D148284: [clangd] Add "readonly" token to const member expressions

2023-04-13 Thread Thorben Tröbst via Phabricator via cfe-commits
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 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


[PATCH] D148284: [clangd] Add "readonly" token to const member expressions

2023-05-01 Thread Thorben Tröbst via Phabricator via cfe-commits
t-troebst updated this revision to Diff 518641.
t-troebst added a comment.

Add best effort attempt to get const-ness for dependent member expressions.


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,109 @@
 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",
+  R"cpp(
+template $Bracket[[<]]typename $TemplateParameter[[T]]$Bracket[[>]]
+void $Function[[foo]]($TemplateParameter[[T]] $Parameter[[x]], const $TemplateParameter[[T]] $Parameter_readonly[[y]]) {
+  $Parameter[[x]].$Unknown[[a]];
+  $Parameter_readonly[[y]].$Unknown_readonly[[b]];
+}
+  )cpp",
+  R"cpp(
+template $Bracket[[<]]typename $TemplateParameter[[T]]$Bracket[[>]]
+void $Function[[foo]]($TemplateParameter[[T]]* $Parameter[[x]], const $TemplateParameter[[T]]* $Parameter_readonly[[y]], $TemplateParameter[[T]]* const $Parameter_readonly[[z]]) {
+  $Parameter[[x]]->$Unknown[[a]];
+  $Parameter_readonly[[y]]->$Unknown_readonly[[b]];
+  $Parameter_readonly[[z]]->$Unknown[[c]];
+}
+  )cpp",
+  };
+
+  for (const char *Test : TestCases)
+checkHighlightings(Test, {}, 1 << unsigned(HighlightingModifier::Readonly));
+}
+
 // Ranges are highlighted as variables, unless highlighted as $Function etc.
 std::vector 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 Vi

[PATCH] D148284: [clangd] Add "readonly" token to const member expressions

2023-05-01 Thread Thorben Tröbst via Phabricator via cfe-commits
t-troebst added a comment.

I've added some logic to get const-ness for dependent expressions. I think 
you're right that its probably reasonable to do this since mutable is almost 
always used in member functions where the type isn't dependent anyways.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D148284

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits