From f368294251b6bd63fc0911e68c688eecfdab9d22 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> Date: Tue, 7 Apr 2015 16:12:57 +0200 Subject: [PATCH] CppTools: Fix global completion after '&' Regression introduced by commit 9fb5b0be15a1d877132942ca5da1829510f23361 CppTools: Add basic completion support for qt5 style signals/slots Change-Id: I0a8e5ef31c1394512a51a26ed08b0f445add5acd Reviewed-by: Erik Verbruggen <erik.verbruggen@theqtcompany.com> Reviewed-by: Eike Ziller <eike.ziller@theqtcompany.com> --- src/plugins/cpptools/cppcompletion_test.cpp | 43 ++++++++++++++++---- src/plugins/cpptools/cppcompletionassist.cpp | 8 +++- src/plugins/cpptools/cpptoolsplugin.h | 3 ++ 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index e6cc0068250..f15950bc71c 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -162,6 +162,16 @@ private: IEditor *m_editor; }; +bool isProbablyGlobalCompletion(const QStringList &list) +{ + const int numberOfPrimitivesAndBasicKeywords = (T_LAST_PRIMITIVE - T_FIRST_PRIMITIVE) + + (T_FIRST_OBJC_AT_KEYWORD - T_FIRST_KEYWORD); + + return list.size() >= numberOfPrimitivesAndBasicKeywords + && list.contains(QLatin1String("if")) + && list.contains(QLatin1String("bool")); +} + } // anonymous namespace void CppToolsPlugin::test_completion_basic_1() @@ -327,6 +337,31 @@ void CppToolsPlugin::test_completion() QCOMPARE(actualCompletions, expectedCompletions); } +void CppToolsPlugin::test_global_completion_data() +{ + QTest::addColumn<QByteArray>("code"); + QTest::addColumn<QByteArray>("prefix"); + + // Check that special completion after '&' for Qt5 signal/slots does not + // interfere global completion after '&' + QTest::newRow("global completion after & in return expression") + << _("void f() { foo(myObject, @); }\n") + << _("&"); + QTest::newRow("global completion after & in function argument") + << _("int f() { return @; }\n") + << _("&"); +} + +void CppToolsPlugin::test_global_completion() +{ + QFETCH(QByteArray, code); + QFETCH(QByteArray, prefix); + + CompletionTestCase test(code, prefix); + QVERIFY(test.succeededSoFar()); + QVERIFY(isProbablyGlobalCompletion(test.getCompletions())); +} + static void enumTestCase(const QByteArray &tag, const QByteArray &source, const QByteArray &prefix = QByteArray()) { @@ -2337,14 +2372,6 @@ void CppToolsPlugin::test_completion_data() << QLatin1String("hiddenFunction") << QLatin1String("hiddenSignal")); - QTest::newRow("Qt5 signals: no class name completion if not after 'connect(' 1") - << commonSignalSlotCompletionTestCode - << _("foo(myObject, &") << (QStringList()); - - QTest::newRow("Qt5 signals/slots: no class name completion if not after 'connect(' 2") - << commonSignalSlotCompletionTestCode - << _("&") << (QStringList()); - QTest::newRow("Qt5 signals: fallback to scope completion") << commonSignalSlotCompletionTestCode << _("connect(myObject, &N::") << (QStringList() diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp index bb482038ec4..8811ae5132c 100644 --- a/src/plugins/cpptools/cppcompletionassist.cpp +++ b/src/plugins/cpptools/cppcompletionassist.cpp @@ -1128,8 +1128,14 @@ int InternalCppCompletionAssistProcessor::startCompletionHelper() // "connect(sender, &" or // "connect(otherSender, &Foo::signal1, receiver, &" const int beforeExpression = startOfExpression - 1; - if (canCompleteClassNameAt2ndOr4thConnectArgument(m_interface.data(), beforeExpression)) + if (canCompleteClassNameAt2ndOr4thConnectArgument(m_interface.data(), + beforeExpression)) { m_model->m_completionOperator = CompleteQt5SignalOrSlotClassNameTrigger; + } else { // Ensure global completion + startOfExpression = endOfExpression = m_startPosition; + expression.clear(); + m_model->m_completionOperator = T_EOF_SYMBOL; + } } else if (m_model->m_completionOperator == T_COLON_COLON) { // We expect 'expression' to be "Foo" in // "connect(sender, &Foo::" or diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index 128d9220850..ea9cc91ed74 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -112,6 +112,9 @@ private slots: void test_completion_data(); void test_completion(); + void test_global_completion_data(); + void test_global_completion(); + void test_completion_member_access_operator_data(); void test_completion_member_access_operator(); -- GitLab