diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2022-04-20 17:27:51 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2022-04-21 09:17:15 +0000 |
commit | cf96a91b69d6d9c8d8f8db3e3eadaa24d25d5f32 (patch) | |
tree | 706129bae44d95ca004ea3258318f8250e2e7a69 | |
parent | 2529b62315edc7aafe8407ea2de898923d085f9e (diff) |
ClangCodeModel: Fix mis-detection of class members as operators
The name check was not tight enough.
Change-Id: I5d813a29525bd5b5c23ce04f0bd9e5982a36536e
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
-rw-r--r-- | src/plugins/clangcodemodel/clangdclient.cpp | 14 | ||||
-rw-r--r-- | src/plugins/clangcodemodel/test/clangdtests.cpp | 8 | ||||
-rw-r--r-- | src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp | 9 |
3 files changed, 28 insertions, 3 deletions
diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index cc8e7c8dc0..b12c63c859 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 c0b0805ca3..e22f2dc6ff 100644 --- a/src/plugins/clangcodemodel/test/clangdtests.cpp +++ b/src/plugins/clangcodemodel/test/clangdtests.cpp @@ -1329,6 +1329,14 @@ void ClangdTestHighlighting::test_data() << QList<int>{C_FIELD} << 0; QTest::newRow("pass inherited member by value") << 1038 << 21 << 1038 << 26 << QList<int>{C_FIELD} << 0; + QTest::newRow("fake operator member declaration") << 1045 << 9 << 1045 << 23 + << QList<int>{C_FIELD, C_DECLARATION} << 0; + QTest::newRow("fake operator method declaration") << 1046 << 10 << 1046 << 24 + << QList<int>{C_FUNCTION, C_DECLARATION} << 0; + QTest::newRow("fake operator member access") << 1049 << 8 << 1049 << 22 + << QList<int>{C_FIELD} << 0; + QTest::newRow("fake operator method call") << 1050 << 8 << 1050 << 22 + << QList<int>{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 cd4ecb46ce..9d1ba0d5e7 100644 --- a/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp +++ b/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp @@ -1040,3 +1040,12 @@ template<typename T> class Derived2 : public BaseWithMember2 return false; } }; + +struct StructWithMisleadingMemberNames { + int operatormember; + void operatorMethod(); +}; +void useStrangeStruct(StructWithMisleadingMemberNames *s) { + s->operatormember = 5; + s->operatorMethod(); +} |