From 8d283ffd1695b9d3accaaa58d40db82ac04fdf16 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 30 Jul 2013 11:56:50 +0200 Subject: [PATCH] CppTools: Hide "QPrivateSignal" on signal completion (Qt5) See also http://woboq.com/blog/how-qt-signals-slots-work-part2-qt5.html Task-number: QTCREATORBUG-8540 Change-Id: Iccad837d7a0da982e7d7a1eda95ff1828cf1dce6 Reviewed-by: Friedemann Kleint Reviewed-by: Fawzi Mohamed Reviewed-by: Christian Kandeler --- src/plugins/cpptools/cppcompletion_test.cpp | 33 ++++++++++++++++++++ src/plugins/cpptools/cppcompletionassist.cpp | 20 ++++++++++++ src/plugins/cpptools/cpptoolsplugin.h | 2 ++ 3 files changed, 55 insertions(+) diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index 369f520cd22..017559bdca1 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -2463,3 +2463,36 @@ void CppToolsPlugin::test_completion_recursive_using_typedef_declarations() QCOMPARE(completions.size(), 0); } + +void CppToolsPlugin::test_completion_signals_hide_QPrivateSignal() +{ + const QByteArray source = + "#define SIGNAL(a) #a\n" + "#define SLOT(a) #a\n" + "#define signals public\n" + "#define Q_OBJECT struct QPrivateSignal {};\n" + "\n" + "class QObject\n" + "{\n" + "public:\n" + " void connect(QObject *, char *, QObject *, char *);\n" + "};\n" + "\n" + "class Timer : public QObject\n" + "{\n" + " Q_OBJECT\n" + "signals:\n" + " void timeout(QPrivateSignal);\n" + "};\n" + "\n" + "void client()\n" + "{\n" + " Timer *timer = new Timer;\n" + " connect(timer, SIGNAL(@\n" + "}\n"; + CompletionTestCase test(source); + + const QStringList completions = test.getCompletions(); + QCOMPARE(completions.size(), 1); + QVERIFY(completions.contains(QLatin1String("timeout()"))); +} diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp index f132e35a4b1..8184011a4d8 100644 --- a/src/plugins/cpptools/cppcompletionassist.cpp +++ b/src/plugins/cpptools/cppcompletionassist.cpp @@ -602,6 +602,24 @@ Function *asFunctionOrTemplateFunctionType(FullySpecifiedType ty) return 0; } +bool isQPrivateSignal(const Symbol *symbol) +{ + if (!symbol) + return false; + + static Identifier qPrivateSignalIdentifier("QPrivateSignal", 14); + + if (FullySpecifiedType type = symbol->type()) { + if (NamedType *namedType = type->asNamedType()) { + if (const Name *name = namedType->name()) { + if (name->isEqualTo(&qPrivateSignalIdentifier)) + return true; + } + } + } + return false; +} + } // Anonymous // ---------------------------- @@ -1620,6 +1638,8 @@ bool CppCompletionAssistProcessor::completeQtMethod(const QListargumentAt(i); + if (isQPrivateSignal(arg)) + continue; if (i != 0) signature += QLatin1Char(','); signature += o.prettyType(arg->type()); diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index 5283c1dd83a..f16591f100c 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -148,6 +148,8 @@ private slots: void test_completion_recursive_using_declarations2(); void test_completion_recursive_using_typedef_declarations(); + void test_completion_signals_hide_QPrivateSignal(); + void test_format_pointerdeclaration_in_simpledeclarations(); void test_format_pointerdeclaration_in_simpledeclarations_data(); void test_format_pointerdeclaration_in_controlflowstatements();