Commit 8d283ffd authored by Nikolai Kosjar's avatar Nikolai Kosjar

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: default avatarFriedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: default avatarFawzi Mohamed <fawzi.mohamed@digia.com>
Reviewed-by: default avatarChristian Kandeler <christian.kandeler@digia.com>
parent 05c6a572
......@@ -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()")));
}
......@@ -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 QList<CPlusPlus::Looku
signature += QLatin1Char('(');
for (unsigned i = 0; i < count; ++i) {
Symbol *arg = fun->argumentAt(i);
if (isQPrivateSignal(arg))
continue;
if (i != 0)
signature += QLatin1Char(',');
signature += o.prettyType(arg->type());
......
......@@ -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();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment