From 849534ec6fd20ef8f2c5821e96a5e0e3cfbd32b5 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar <nikolai.kosjar@digia.com> Date: Tue, 23 Apr 2013 11:46:55 +0200 Subject: [PATCH] Revert "C++: fix support for typedef of templated typedefs" Still crashes when opening the Qt Creator project, g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2 (Ubuntu 12.10). This reverts commit 564c9b2842663062658a0febdcc5787098d871b2. Change-Id: Ief5c0aad463d245f68805f747d277ac298796c3d Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com> --- src/libs/cplusplus/LookupContext.cpp | 67 +--------- src/libs/cplusplus/LookupContext.h | 5 - src/libs/cplusplus/ResolveExpression.cpp | 11 +- src/plugins/cpptools/cppcompletion_test.cpp | 135 -------------------- src/plugins/cpptools/cpptoolsplugin.h | 5 - 5 files changed, 5 insertions(+), 218 deletions(-) diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index 623a1be8ec9..dde50df687f 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -719,22 +719,10 @@ ClassOrNamespace *ClassOrNamespace::lookupType_helper(const Name *name, if (name->isNameId() || name->isTemplateNameId() || name->isAnonymousNameId()) { flush(); - if (name->isTemplateNameId()) { - // if it is a base specialization, the 'name' could be an instantiation - QMap<const TemplateNameId *, ClassOrNamespace *>::iterator it - = _instantiations.find(name->asTemplateNameId()); - if (it != _instantiations.end()) - return it.value(); - } - foreach (Symbol *s, symbols()) { if (Class *klass = s->asClass()) { if (klass->identifier() && klass->identifier()->isEqualTo(name->identifier())) return this; - - if (ClassOrNamespace *typedefedType - = resolveTypedef(klass, name, searchInEnclosingScope, origin)) - return typedefedType; } } @@ -758,9 +746,6 @@ ClassOrNamespace *ClassOrNamespace::lookupType_helper(const Name *name, } foreach (ClassOrNamespace *u, usings()) { - // usings are not instantiated for templates - if (_templateId && u->_templateId) - continue; if (ClassOrNamespace *r = u->lookupType_helper(name, processed, /*searchInEnclosingScope =*/ false, @@ -769,21 +754,8 @@ ClassOrNamespace *ClassOrNamespace::lookupType_helper(const Name *name, } } - return lookupType_helper_inParent(name, processed, searchInEnclosingScope, origin); - } - - return 0; -} - -ClassOrNamespace *ClassOrNamespace::lookupType_helper_inParent(const Name *name, QSet<ClassOrNamespace *> *processed, - bool searchInEnclosingScope, ClassOrNamespace *origin) -{ - if (_parent && searchInEnclosingScope) { - // for templates _parent is a base specialization, - // so we should take here rather _parent of this base specialization - ClassOrNamespace *parent = _templateId ? _parent->_parent : _parent; - if (parent) - return parent->lookupType_helper(name, processed, searchInEnclosingScope, origin); + if (_parent && searchInEnclosingScope) + return _parent->lookupType_helper(name, processed, searchInEnclosingScope, origin); } return 0; @@ -823,39 +795,6 @@ ClassOrNamespace *ClassOrNamespace::findSpecializationWithPointer(const Template return 0; } -ClassOrNamespace *ClassOrNamespace::resolveTypedef(Class *klass, const Name *name, - bool searchInEnclosingScope, - ClassOrNamespace *origin) -{ - // it can be a typedef - const unsigned memberClassCount = klass->memberCount(); - for (unsigned i = 0; i < memberClassCount; ++i) { - Symbol *memberClassAsSymbol = klass->memberAt(i); - if (Declaration *declaration = memberClassAsSymbol->asDeclaration()) { - if (declaration->isTypedef() - && name->identifier()->isEqualTo(declaration->name()->identifier())) { - if (NamedType *namedType = declaration->type()->asNamedType()) { - QSet<ClassOrNamespace *> innerProcessed; - const Name *namedTypeName = namedType->name(); - const QualifiedNameId *q = namedTypeName->asQualifiedNameId(); - if (q) { - if (name->isEqualTo(q->base()) && name->isEqualTo(q->name())) - return lookupType_helper_inParent(name, &innerProcessed, - searchInEnclosingScope, - origin); - if ((klass->identifier() - && klass->identifier()->isEqualTo(q->base()->identifier()))) - return this; - } - - return lookupType_helper(namedTypeName, &innerProcessed, true, origin); - } - } - } - } - return 0; -} - ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespace *origin) { Q_ASSERT(name != 0); @@ -1020,7 +959,7 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac oo.showReturnTypes = true; oo.showTemplateParameters = true; qDebug()<<"cloned"<<oo(clone->type()); - if (Class *klass = clone->asClass()) { + if (Class *klass = s->asClass()) { const unsigned klassMemberCount = klass->memberCount(); for (unsigned i = 0; i < klassMemberCount; ++i){ Symbol *klassMemberAsSymbol = klass->memberAt(i); diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h index 1ad9a27dd07..3dbe525766a 100644 --- a/src/libs/cplusplus/LookupContext.h +++ b/src/libs/cplusplus/LookupContext.h @@ -111,9 +111,6 @@ private: ClassOrNamespace *lookupType_helper(const Name *name, QSet<ClassOrNamespace *> *processed, bool searchInEnclosingScope, ClassOrNamespace *origin); - ClassOrNamespace *lookupType_helper_inParent(const Name *name, QSet<ClassOrNamespace *> *processed, - bool searchInEnclosingScope, ClassOrNamespace *origin); - ClassOrNamespace *nestedType(const Name *name, ClassOrNamespace *origin); void instantiateNestedClasses(ClassOrNamespace *enclosingTemplateClass, @@ -123,8 +120,6 @@ private: bool isInstantiateNestedClassNeeded(const QList<Symbol *>& symbols, const Subst &subst) const; ClassOrNamespace *findSpecializationWithPointer(const TemplateNameId *templId, const TemplateNameIdTable &specializations); - ClassOrNamespace *resolveTypedef(Class *klass, const Name *name, - bool searchInEnclosingScope, ClassOrNamespace *origin); CreateBindings *_factory; ClassOrNamespace *_parent; diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index 8a72fc1fc2a..029bcee00d4 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -690,15 +690,8 @@ bool ResolveExpression::visit(CallAST *ast) } } else if (Function *funTy = ty->asFunctionType()) { - if (maybeValidPrototype(funTy, actualArgumentCount)) { - LookupItem item; - item.setType(funTy->returnType().simplified()); - item.setScope(scope); - // we have to remember a binding because it can be a template instantiation - item.setBinding(result.binding()); - - _results.append(item); - } + if (maybeValidPrototype(funTy, actualArgumentCount)) + addResult(funTy->returnType().simplified(), scope); } else if (Class *classTy = ty->asClassType()) { // Constructor call diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index b5cd103374a..b8ee95f7c04 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -1882,138 +1882,3 @@ void CppToolsPlugin::test_completion_QTCREATORBUG9098() QVERIFY(completions.contains(QLatin1String("c"))); QVERIFY(completions.contains(QLatin1String("B"))); } - -void CppToolsPlugin::test_completion_typedef_of_templated_typedef_QTCREATORBUG8375() -{ - TestData data; - data.srcText = - "struct Foo\n" - "{ void bar(); };\n" - "struct A\n" - "{ typedef Foo AFoo; };\n" - "template <class T>\n" - "struct B\n" - "{ typedef typename T::AFoo BFoo; };\n" - "struct C : public B<A>\n" - "{\n" - " void test()\n" - " {\n" - " BFoo foo;\n" - " @\n" - " // padding so we get the scope right\n" - " }\n" - "};\n" - ; - setup(&data); - - Utils::ChangeSet change; - QString txt = QLatin1String("foo."); - change.insert(data.pos, txt); - QTextCursor cursor(data.doc); - change.apply(&cursor); - data.pos += txt.length(); - - QStringList completions = getCompletions(data); - - QCOMPARE(completions.size(), 2); - QVERIFY(completions.contains(QLatin1String("Foo"))); - QVERIFY(completions.contains(QLatin1String("bar"))); -} - -void CppToolsPlugin::test_completion_typedef_with_the_same_base_name_and_new_type_name() -{ - TestData data; - data.srcText = - "namespace A\n" - "{\n" - "struct A { int aa; };\n" - "}\n" - "struct S\n" - "{\n" - " typedef A::A A;\n" - " A a;\n" - "};\n" - "void fun()\n" - "{\n" - " S s;\n" - " @\n" - " // padding so we get the scope right\n" - "};\n" - ; - setup(&data); - - Utils::ChangeSet change; - QString txt = QLatin1String("s.a."); - change.insert(data.pos, txt); - QTextCursor cursor(data.doc); - change.apply(&cursor); - data.pos += txt.length(); - - QStringList completions = getCompletions(data); - - QCOMPARE(completions.size(), 2); - QVERIFY(completions.contains(QLatin1String("A"))); - QVERIFY(completions.contains(QLatin1String("aa"))); -} - -void CppToolsPlugin::test_completion_qualified_typedef_1() -{ - TestData data; - data.srcText = - "struct S\n" - "{\n" - " typedef S::type type;\n" - "};\n" - "void fun()\n" - "{\n" - " @\n" - " // padding so we get the scope right\n" - "};\n" - ; - setup(&data); - - Utils::ChangeSet change; - QString txt = QLatin1String("S::"); - change.insert(data.pos, txt); - QTextCursor cursor(data.doc); - change.apply(&cursor); - data.pos += txt.length(); - - QStringList completions = getCompletions(data); - - QCOMPARE(completions.size(), 2); - QVERIFY(completions.contains(QLatin1String("S"))); - QVERIFY(completions.contains(QLatin1String("type"))); -} - -void CppToolsPlugin::test_completion_qualified_typedef_2() -{ - TestData data; - data.srcText = - "template <typename T>\n" - "struct S\n" - "{\n" - " typedef S<T>::type type;\n" - "};\n" - "void fun()\n" - "{\n" - " @\n" - " // padding so we get the scope right\n" - "};\n" - ; - setup(&data); - - Utils::ChangeSet change; - QString txt = QLatin1String("S<int>::"); - change.insert(data.pos, txt); - QTextCursor cursor(data.doc); - change.apply(&cursor); - data.pos += txt.length(); - - QStringList completions = getCompletions(data); - - QCOMPARE(completions.size(), 2); - QVERIFY(completions.contains(QLatin1String("S"))); - QVERIFY(completions.contains(QLatin1String("type"))); -} - diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index 05607067085..10975a53013 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -124,11 +124,6 @@ private slots: void test_completion_typedef_using_templates2(); void test_completion_namespace_alias_with_many_namespace_declarations(); void test_completion_QTCREATORBUG9098(); - void test_completion_typedef_of_templated_typedef_QTCREATORBUG8375(); - void test_completion_typedef_with_the_same_base_name_and_new_type_name(); - void test_completion_qualified_typedef_1(); - void test_completion_qualified_typedef_2(); - void test_format_pointerdeclaration_in_simpledeclarations(); void test_format_pointerdeclaration_in_simpledeclarations_data(); -- GitLab