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