aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2020-08-06 15:53:07 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2020-08-10 12:30:28 +0000
commit7cd9699766b9ec6fd9e109cb92d83342ee3e0f54 (patch)
tree8d1e49cc09f3424298dbc98a461cf20d9d512ffe
parentc6a56cce28807d84e1ba01925061ec301e79440c (diff)
CppEditor: Fix following signals/slots in old-style connects
... if the first argument is a call to a function returning a pointer to QObject. Fixes: QTCREATORBUG-13265 Change-Id: I12c2d07331a0c6dca56ad55c518240fd74be3dca Reviewed-by: Christian Stenger <christian.stenger@qt.io>
-rw-r--r--src/libs/cplusplus/ResolveExpression.cpp7
-rw-r--r--src/plugins/cppeditor/cppeditorplugin.h1
-rw-r--r--src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp20
3 files changed, 27 insertions, 1 deletions
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index 81b2066634c..99db8cef9df 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -1085,7 +1085,12 @@ ClassOrNamespace *ResolveExpression::baseExpression(const QList<LookupItem> &bas
qDebug() << "- after typedef resolving:" << oo(ty);
if (accessOp == T_ARROW) {
- if (PointerType *ptrTy = ty->asPointerType()) {
+ PointerType *ptrTy = ty->asPointerType();
+ if (!ptrTy) {
+ if (Function * const func = ty->asFunctionType())
+ ptrTy = func->returnType()->asPointerType();
+ }
+ if (ptrTy) {
FullySpecifiedType type = ptrTy->elementType();
if (ClassOrNamespace *binding
= findClassForTemplateParameterInExpressionScope(r.binding(),
diff --git a/src/plugins/cppeditor/cppeditorplugin.h b/src/plugins/cppeditor/cppeditorplugin.h
index cfeb087fd0e..a56373c9028 100644
--- a/src/plugins/cppeditor/cppeditorplugin.h
+++ b/src/plugins/cppeditor/cppeditorplugin.h
@@ -85,6 +85,7 @@ private slots:
void test_FollowSymbolUnderCursor_QObject_connect_data();
void test_FollowSymbolUnderCursor_QObject_connect();
+ void test_FollowSymbolUnderCursor_QObject_oldStyleConnect();
void test_FollowSymbolUnderCursor_classOperator_onOperatorToken_data();
void test_FollowSymbolUnderCursor_classOperator_onOperatorToken();
diff --git a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp
index 17f2e364f9c..8bbb010422e 100644
--- a/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp
+++ b/src/plugins/cppeditor/followsymbol_switchmethoddecldef_test.cpp
@@ -1309,6 +1309,26 @@ void CppEditorPlugin::test_FollowSymbolUnderCursor_QObject_connect()
F2TestCase(F2TestCase::FollowSymbolUnderCursorAction, singleDocument(source));
}
+void CppEditorPlugin::test_FollowSymbolUnderCursor_QObject_oldStyleConnect()
+{
+ const QByteArray source =
+ "class O : public QObject {\n"
+ " Q_OBJECT\n"
+ "signals:\n"
+ " void $theSignal();\n"
+ "};\n"
+ "struct S {\n"
+ " O* o();\n"
+ "};\n"
+ "int main()\n"
+ "{\n"
+ " S s;\n"
+ " QObject::connect(s.o(), SIGNAL(@theSignal()), s.o(), SIGNAL(theSignal()));\n"
+ "}\n";
+
+ F2TestCase(F2TestCase::FollowSymbolUnderCursorAction, singleDocument(source));
+}
+
void CppEditorPlugin::test_FollowSymbolUnderCursor_classOperator_onOperatorToken_data()
{
QTest::addColumn<bool>("toDeclaration");