diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2011-12-21 18:43:02 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-09 19:10:21 -0300 |
commit | 3fed11c07c214e4c396f2ecfd19236ac1dcedb07 (patch) | |
tree | c0bcc5611a7a52eaa88058355182d03167023a20 | |
parent | 8550517e9d3a03603ece294e4183853040e16fd8 (diff) |
Fixed type resolution for types inside scopes, but their names omit this information.
-rw-r--r-- | tests/testnestedtypes.cpp | 35 | ||||
-rw-r--r-- | tests/testnestedtypes.h | 1 | ||||
-rw-r--r-- | typedatabase.cpp | 23 |
3 files changed, 55 insertions, 4 deletions
diff --git a/tests/testnestedtypes.cpp b/tests/testnestedtypes.cpp index 76c5ccd1a..4e000cb08 100644 --- a/tests/testnestedtypes.cpp +++ b/tests/testnestedtypes.cpp @@ -82,6 +82,41 @@ void TestNestedTypes::testNestedTypesModifications() QVERIFY(removedFunc->isModifiedRemoved()); } + +void TestNestedTypes::testDuplicationOfNestedTypes() +{ + const char* cppCode ="\ + namespace Namespace {\ + class SomeClass {};\ + };"; + const char* xmlCode = "\ + <typesystem package='Foo'> \ + <namespace-type name='Namespace'>\ + <value-type name='SomeClass'>\ + <add-function signature='createSomeClass(SomeClass)'/>\ + </value-type>\ + </namespace-type>\ + </typesystem>"; + + TestUtil t(cppCode, xmlCode, false); + AbstractMetaClassList classes = t.builder()->classes(); + QCOMPARE(classes.count(), 2); + AbstractMetaClass* nspace = classes.findClass("Namespace"); + QVERIFY(nspace); + AbstractMetaClass* cls1 = classes.findClass("SomeClass"); + QVERIFY(cls1); + AbstractMetaClass* cls2 = classes.findClass("Namespace::SomeClass"); + QVERIFY(cls2); + QCOMPARE(cls1, cls2); + QCOMPARE(cls1->name(), QString("SomeClass")); + QCOMPARE(cls1->qualifiedCppName(), QString("Namespace::SomeClass")); + + TypeEntry* t1 = TypeDatabase::instance()->findType("Namespace::SomeClass"); + QVERIFY(t1); + TypeEntry* t2 = TypeDatabase::instance()->findType("SomeClass"); + QCOMPARE(t1, t2); +} + QTEST_APPLESS_MAIN(TestNestedTypes) #include "testnestedtypes.moc" diff --git a/tests/testnestedtypes.h b/tests/testnestedtypes.h index b9980b0a6..d0b828b0c 100644 --- a/tests/testnestedtypes.h +++ b/tests/testnestedtypes.h @@ -30,6 +30,7 @@ class TestNestedTypes : public QObject Q_OBJECT private slots: void testNestedTypesModifications(); + void testDuplicationOfNestedTypes(); }; #endif diff --git a/typedatabase.cpp b/typedatabase.cpp index d5c1eb6ce..1247bf7f3 100644 --- a/typedatabase.cpp +++ b/typedatabase.cpp @@ -141,14 +141,29 @@ PrimitiveTypeEntry* TypeDatabase::findTargetLangPrimitiveType(const QString& tar TypeEntry* TypeDatabase::findType(const QString& name) const { - QList<TypeEntry *> entries = findTypes(name); - foreach (TypeEntry *entry, entries) { + TypeEntry* typeEntry = 0; + QList<TypeEntry *> typeEntries = findTypes(name); + + if (typeEntries.isEmpty()) { + SingleTypeEntryHash entriesHash = entries(); + foreach (QString typeName, entriesHash.keys()) { + // Let's try to find the type in different scopes. + // We will prefer the ones with the least depth. + if (typeName.endsWith("::"+name) + && (!typeEntry || typeEntry->qualifiedCppName().count("::") < typeName.count("::"))) { + typeEntry = entriesHash[typeName]; + } + } + } + + foreach (TypeEntry* entry, typeEntries) { if (entry && (!entry->isPrimitive() || static_cast<PrimitiveTypeEntry *>(entry)->preferredTargetLangType())) { - return entry; + typeEntry = entry; + break; } } - return 0; + return typeEntry; } SingleTypeEntryHash TypeDatabase::entries() const |