From 7cd9699766b9ec6fd9e109cb92d83342ee3e0f54 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 6 Aug 2020 15:53:07 +0200 Subject: [PATCH] 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 --- src/libs/cplusplus/ResolveExpression.cpp | 7 ++++++- src/plugins/cppeditor/cppeditorplugin.h | 1 + .../followsymbol_switchmethoddecldef_test.cpp | 20 +++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) 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 &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("toDeclaration");