aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2022-04-20 17:27:51 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2022-04-21 09:17:15 +0000
commitcf96a91b69d6d9c8d8f8db3e3eadaa24d25d5f32 (patch)
tree706129bae44d95ca004ea3258318f8250e2e7a69
parent2529b62315edc7aafe8407ea2de898923d085f9e (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.cpp14
-rw-r--r--src/plugins/clangcodemodel/test/clangdtests.cpp8
-rw-r--r--src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp9
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();
+}