diff --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp b/clang-tools-extra/clangd/SemanticHighlighting.cpp index 2ab7461eee9c6c..aafff0ae285fcd 100644 --- a/clang-tools-extra/clangd/SemanticHighlighting.cpp +++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp @@ -539,13 +539,17 @@ class CollectExtraHighlightings if (isa(E)) return true; - // FIXME ...here it would make sense though. - if (isa(E)) - return true; + // FIXME: consider highlighting parameters of some other overloaded + // operators as well + llvm::ArrayRef Args = {E->getArgs(), E->getNumArgs()}; + if (const auto callOp = dyn_cast(E)) { + if (callOp->getOperator() != OO_Call) + return true; + Args = Args.drop_front(); // Drop object parameter + } highlightMutableReferenceArguments( - dyn_cast_or_null(E->getCalleeDecl()), - {E->getArgs(), E->getNumArgs()}); + dyn_cast_or_null(E->getCalleeDecl()), Args); return true; } diff --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp index b877da9755a3ab..db183d648b5b52 100644 --- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp +++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp @@ -738,6 +738,11 @@ sizeof...($TemplateParameter[[Elements]]); )cpp", // Modifier for variables passed as non-const references R"cpp( + struct $Class_decl[[ClassWithOp]] { + void operator()(int); + void operator()(int, int &); + void operator()(int, int, const int &); + }; void $Function_decl[[fun]](int, const int, int*, const int*, int&, const int&, @@ -759,6 +764,13 @@ sizeof...($TemplateParameter[[Elements]]); $LocalVariable[[array]], $LocalVariable_usedAsMutableReference[[array]], $LocalVariable[[array]] ); + [](int){}($LocalVariable[[val]]); + [](int&){}($LocalVariable_usedAsMutableReference[[val]]); + [](const int&){}($LocalVariable[[val]]); + $Class[[ClassWithOp]] $LocalVariable_decl[[c]]; + $LocalVariable[[c]]($LocalVariable[[val]]); + $LocalVariable[[c]](0, $LocalVariable_usedAsMutableReference[[val]]); + $LocalVariable[[c]](0, 0, $LocalVariable[[val]]); } struct $Class_decl[[S]] { $Class_decl[[S]](int&) {