forked from qt-creator/qt-creator
CppEditor: Prevent "Add Declaration" for existing template functions
class Foo
{
template<class T>
void func();
};
template<class T>
void Foo::func() {} // Add Declaration should not be triggered at all
Change-Id: Ifff733d8381177300dae017ae419200cfdf5c425
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
committed by
Orgad Shaneh
parent
65dc6d0fc2
commit
2890966ec3
@@ -147,6 +147,7 @@ private slots:
|
||||
void test_quickfix_InsertDefFromDecl_unicodeIdentifier();
|
||||
|
||||
void test_quickfix_InsertDeclFromDef();
|
||||
void test_quickfix_InsertDeclFromDef_notTriggeredForTemplateFunc();
|
||||
|
||||
void test_quickfix_AddIncludeForUndefinedIdentifier_data();
|
||||
void test_quickfix_AddIncludeForUndefinedIdentifier();
|
||||
|
||||
@@ -2715,6 +2715,22 @@ void CppEditorPlugin::test_quickfix_InsertDeclFromDef()
|
||||
insertToSectionDeclFromDef("private slots", 5);
|
||||
}
|
||||
|
||||
void CppEditorPlugin::test_quickfix_InsertDeclFromDef_notTriggeredForTemplateFunc()
|
||||
{
|
||||
QByteArray contents =
|
||||
"class Foo\n"
|
||||
"{\n"
|
||||
" template<class T>\n"
|
||||
" void func();\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
"template<class T>\n"
|
||||
"void Foo::fu@nc() {}\n";
|
||||
|
||||
InsertDeclFromDef factory;
|
||||
QuickFixOperationTest(singleDocument(contents, ""), &factory);
|
||||
}
|
||||
|
||||
void CppEditorPlugin::test_quickfix_AddIncludeForUndefinedIdentifier_data()
|
||||
{
|
||||
QTest::addColumn<QString>("headerPath");
|
||||
|
||||
@@ -2465,7 +2465,17 @@ void InsertDeclFromDef::match(const CppQuickFixInterface &interface, QuickFixOpe
|
||||
Function *fun = funDef->symbol;
|
||||
if (Class *matchingClass = isMemberFunction(interface.context(), fun)) {
|
||||
const QualifiedNameId *qName = fun->name()->asQualifiedNameId();
|
||||
for (Symbol *s = matchingClass->find(qName->identifier()); s; s = s->next()) {
|
||||
for (Symbol *symbol = matchingClass->find(qName->identifier());
|
||||
symbol; symbol = symbol->next()) {
|
||||
Symbol *s = symbol;
|
||||
if (fun->enclosingScope()->isTemplate()) {
|
||||
if (const Template *templ = s->type()->asTemplateType()) {
|
||||
if (Symbol *decl = templ->declaration()) {
|
||||
if (decl->type()->isFunctionType())
|
||||
s = decl;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!s->name()
|
||||
|| !qName->identifier()->match(s->identifier())
|
||||
|| !s->type()->isFunctionType())
|
||||
|
||||
Reference in New Issue
Block a user