From 56966f3712b9ec2d790b7185d230d3193f261a62 Mon Sep 17 00:00:00 2001 From: Przemyslaw Gorszkowski Date: Wed, 21 Nov 2012 09:56:31 +0100 Subject: [PATCH] C++: Fix code completion for Qt containers This change solves only problem with Qt containers. stl containers need separate change. Problem was with predeclaration of template class after declaration of this template class. (there is unit test added which shows the problem). Task-number: QTCREATORBUG-8228 (cover only Qt containers) Change-Id: If1f76c88c955b7b55347d302b353f5cd52b244a4 Reviewed-by: Erik Verbruggen Conflicts: src/plugins/cpptools/cppcompletion_test.cpp Change-Id: I9f665276926f2e440ad0c92e94dd1aeee89005b3 Reviewed-by: Eike Ziller --- src/libs/cplusplus/LookupContext.cpp | 2 +- src/plugins/cpptools/cppcompletion_test.cpp | 39 +++++++++++++++++++++ src/plugins/cpptools/cpptoolsplugin.h | 1 + 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index c2c7b5c5993..4f56c5180a8 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -730,7 +730,7 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac return reference; const TemplateNameId *templId = name->asTemplateNameId(); - if (_alreadyConsideredClasses.contains(referenceClass) || + if ((! templId && _alreadyConsideredClasses.contains(referenceClass)) || (templId && _alreadyConsideredTemplates.contains(templId))) { return reference; diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index f36ac54a6c4..8dce2e5db13 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -370,6 +370,45 @@ void CppToolsPlugin::test_completion_template_5() QVERIFY(completions.contains("b")); } +void CppToolsPlugin::test_completion_template_6() +{ + TestData data; + data.srcText = "\n" + "class Item\n" + "{\n" + " int i;\n" + "};\n" + "\n" + "template \n" + "class Container\n" + "{\n" + " T get();\n" + "};\n" + "\n" + "template class Container;\n" + "\n" + "class ItemContainer: public Container\n" + "{};\n" + "ItemContainer container;\n" + "@\n" + ; + + setup(&data); + + Utils::ChangeSet change; + QString txt = QLatin1String("container.get()."); + 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("Item")); + QVERIFY(completions.contains("i")); +} + void CppToolsPlugin::test_completion() { QFETCH(QByteArray, code); diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index 4bfafddb318..597a6ab27c4 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -96,6 +96,7 @@ private slots: void test_completion_template_3(); void test_completion_template_4(); void test_completion_template_5(); + void test_completion_template_6(); void test_completion_template_as_base(); void test_completion_template_as_base_data(); void test_completion_use_global_identifier_as_base_class();