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.
There's no reason that arguments to e.g. lambda calls should be treated differently than those to "real" functions. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D128329 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 @@ -738,6 +738,11 @@ )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 @@ $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&) { Index: clang-tools-extra/clangd/SemanticHighlighting.cpp =================================================================== --- clang-tools-extra/clangd/SemanticHighlighting.cpp +++ clang-tools-extra/clangd/SemanticHighlighting.cpp @@ -538,12 +538,20 @@ return true; // FIXME ...here it would make sense though. - if (isa<CXXOperatorCallExpr>(E)) - return true; + Expr **args = nullptr; + unsigned numArgs = 0; + if (const auto callOp = dyn_cast<CXXOperatorCallExpr>(E)) { + if (callOp->getOperator() != OO_Call) + return true; + args = E->getArgs() + 1; + numArgs = E->getNumArgs() - 1; + } else { + args = E->getArgs(); + numArgs = E->getNumArgs(); + } highlightMutableReferenceArguments( - dyn_cast_or_null<FunctionDecl>(E->getCalleeDecl()), - {E->getArgs(), E->getNumArgs()}); + dyn_cast_or_null<FunctionDecl>(E->getCalleeDecl()), {args, numArgs}); return true; }
Index: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp +++ clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp @@ -738,6 +738,11 @@ )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 @@ $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&) { Index: clang-tools-extra/clangd/SemanticHighlighting.cpp =================================================================== --- clang-tools-extra/clangd/SemanticHighlighting.cpp +++ clang-tools-extra/clangd/SemanticHighlighting.cpp @@ -538,12 +538,20 @@ return true; // FIXME ...here it would make sense though. - if (isa<CXXOperatorCallExpr>(E)) - return true; + Expr **args = nullptr; + unsigned numArgs = 0; + if (const auto callOp = dyn_cast<CXXOperatorCallExpr>(E)) { + if (callOp->getOperator() != OO_Call) + return true; + args = E->getArgs() + 1; + numArgs = E->getNumArgs() - 1; + } else { + args = E->getArgs(); + numArgs = E->getNumArgs(); + } highlightMutableReferenceArguments( - dyn_cast_or_null<FunctionDecl>(E->getCalleeDecl()), - {E->getArgs(), E->getNumArgs()}); + dyn_cast_or_null<FunctionDecl>(E->getCalleeDecl()), {args, numArgs}); return true; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits