ckandeler created this revision. Herald added subscribers: usaxena95, kadircet, arphaman. Herald added a project: All. ckandeler requested review of this revision. Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov. Herald added a project: clang-tools-extra.
That is, mark constructor parameters being used to initialize non-const reference members. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D128977 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 @@ -745,6 +745,15 @@ int &operator[](int &); int operator[](int) const; }; + struct $Class_decl[[ClassWithRefMembers]] { + $Class_decl[[ClassWithRefMembers]](int $Parameter_decl[[i]]) + : $Field[[i1]]($Parameter[[i]]), + $Field_readonly[[i2]]($Parameter[[i]]), + $Field[[i3]]($Parameter_usedAsMutableReference[[i]]) {} + int $Field_decl[[i1]]; + const int &$Field_decl_readonly[[i2]]; + int &$Field_decl[[i3]]; + }; void $Function_decl[[fun]](int, const int, int*, const int*, int&, const int&, Index: clang-tools-extra/clangd/SemanticHighlighting.cpp =================================================================== --- clang-tools-extra/clangd/SemanticHighlighting.cpp +++ clang-tools-extra/clangd/SemanticHighlighting.cpp @@ -523,6 +523,8 @@ /// e.g. highlights dependent names and 'auto' as the underlying type. class CollectExtraHighlightings : public RecursiveASTVisitor<CollectExtraHighlightings> { + using Base = RecursiveASTVisitor<CollectExtraHighlightings>; + public: CollectExtraHighlightings(HighlightingsBuilder &H) : H(H) {} @@ -533,6 +535,22 @@ return true; } + bool TraverseConstructorInitializer(CXXCtorInitializer *Init) { + if (!Init->isMemberInitializer()) + return Base::TraverseConstructorInitializer(Init); + if (const auto Member = Init->getMember()) { + const auto MemberType = Member->getType(); + if (MemberType->isLValueReferenceType() && + !MemberType->getPointeeType().isConstQualified()) { + if (const auto Param = dyn_cast<DeclRefExpr>(Init->getInit())) { + H.addExtraModifier(Param->getLocation(), + HighlightingModifier::UsedAsMutableReference); + } + } + } + return Base::TraverseConstructorInitializer(Init); + } + bool VisitCallExpr(CallExpr *E) { // Highlighting parameters passed by non-const reference does not really // make sense for literals...
Index: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp +++ clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp @@ -745,6 +745,15 @@ int &operator[](int &); int operator[](int) const; }; + struct $Class_decl[[ClassWithRefMembers]] { + $Class_decl[[ClassWithRefMembers]](int $Parameter_decl[[i]]) + : $Field[[i1]]($Parameter[[i]]), + $Field_readonly[[i2]]($Parameter[[i]]), + $Field[[i3]]($Parameter_usedAsMutableReference[[i]]) {} + int $Field_decl[[i1]]; + const int &$Field_decl_readonly[[i2]]; + int &$Field_decl[[i3]]; + }; void $Function_decl[[fun]](int, const int, int*, const int*, int&, const int&, Index: clang-tools-extra/clangd/SemanticHighlighting.cpp =================================================================== --- clang-tools-extra/clangd/SemanticHighlighting.cpp +++ clang-tools-extra/clangd/SemanticHighlighting.cpp @@ -523,6 +523,8 @@ /// e.g. highlights dependent names and 'auto' as the underlying type. class CollectExtraHighlightings : public RecursiveASTVisitor<CollectExtraHighlightings> { + using Base = RecursiveASTVisitor<CollectExtraHighlightings>; + public: CollectExtraHighlightings(HighlightingsBuilder &H) : H(H) {} @@ -533,6 +535,22 @@ return true; } + bool TraverseConstructorInitializer(CXXCtorInitializer *Init) { + if (!Init->isMemberInitializer()) + return Base::TraverseConstructorInitializer(Init); + if (const auto Member = Init->getMember()) { + const auto MemberType = Member->getType(); + if (MemberType->isLValueReferenceType() && + !MemberType->getPointeeType().isConstQualified()) { + if (const auto Param = dyn_cast<DeclRefExpr>(Init->getInit())) { + H.addExtraModifier(Param->getLocation(), + HighlightingModifier::UsedAsMutableReference); + } + } + } + return Base::TraverseConstructorInitializer(Init); + } + bool VisitCallExpr(CallExpr *E) { // Highlighting parameters passed by non-const reference does not really // make sense for literals...
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits