summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2015-04-07 16:12:57 +0200
committerNikolai Kosjar <nikolai.kosjar@theqtcompany.com>2015-04-13 10:55:44 +0000
commitf368294251b6bd63fc0911e68c688eecfdab9d22 (patch)
treedd86a0bcc15b43ef97a9dfd3d6460180f59838cd /src
parent2ae5e146b3a0a03be3be8d476a293eebcfc78642 (diff)
downloadqt-creator-f368294251b6bd63fc0911e68c688eecfdab9d22.tar.gz
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>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/cpptools/cppcompletion_test.cpp43
-rw-r--r--src/plugins/cpptools/cppcompletionassist.cpp8
-rw-r--r--src/plugins/cpptools/cpptoolsplugin.h3
3 files changed, 45 insertions, 9 deletions
diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp
index e6cc006825..f15950bc71 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 bb482038ec..8811ae5132 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 128d922085..ea9cc91ed7 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();