diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index cc8e7c8dc06..b12c63c8591 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -3839,10 +3839,18 @@ void ExtraHighlightingResultsCollector::collectFromNode(const AstNode &node) QString detail = node.detail().value_or(QString()); const bool isCallToNew = node.kind() == "CXXNew"; const bool isCallToDelete = node.kind() == "CXXDelete"; - if (!isCallToNew && !isCallToDelete - && (!detail.startsWith(operatorPrefix) || detail == operatorPrefix)) { + const auto isProperOperator = [&] { + if (isCallToNew || isCallToDelete) + return true; + if (!detail.startsWith(operatorPrefix)) + return false; + if (detail == operatorPrefix) + return false; + const QChar nextChar = detail.at(operatorPrefix.length()); + return !nextChar.isLetterOrNumber() && nextChar != '_'; + }; + if (!isProperOperator()) return; - } if (!isCallToNew && !isCallToDelete) detail.remove(0, operatorPrefix.length()); diff --git a/src/plugins/clangcodemodel/test/clangdtests.cpp b/src/plugins/clangcodemodel/test/clangdtests.cpp index c0b0805ca32..e22f2dc6fff 100644 --- a/src/plugins/clangcodemodel/test/clangdtests.cpp +++ b/src/plugins/clangcodemodel/test/clangdtests.cpp @@ -1329,6 +1329,14 @@ void ClangdTestHighlighting::test_data() << QList{C_FIELD} << 0; QTest::newRow("pass inherited member by value") << 1038 << 21 << 1038 << 26 << QList{C_FIELD} << 0; + QTest::newRow("fake operator member declaration") << 1045 << 9 << 1045 << 23 + << QList{C_FIELD, C_DECLARATION} << 0; + QTest::newRow("fake operator method declaration") << 1046 << 10 << 1046 << 24 + << QList{C_FUNCTION, C_DECLARATION} << 0; + QTest::newRow("fake operator member access") << 1049 << 8 << 1049 << 22 + << QList{C_FIELD} << 0; + QTest::newRow("fake operator method call") << 1050 << 8 << 1050 << 22 + << QList{C_FUNCTION} << 0; } void ClangdTestHighlighting::test() diff --git a/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp b/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp index cd4ecb46cec..9d1ba0d5e74 100644 --- a/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp +++ b/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp @@ -1040,3 +1040,12 @@ template class Derived2 : public BaseWithMember2 return false; } }; + +struct StructWithMisleadingMemberNames { + int operatormember; + void operatorMethod(); +}; +void useStrangeStruct(StructWithMisleadingMemberNames *s) { + s->operatormember = 5; + s->operatorMethod(); +}