aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcelo Lira <marcelo.lira@openbossa.org>2011-12-21 18:43:02 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-09 19:10:21 -0300
commit3fed11c07c214e4c396f2ecfd19236ac1dcedb07 (patch)
treec0bcc5611a7a52eaa88058355182d03167023a20
parent8550517e9d3a03603ece294e4183853040e16fd8 (diff)
Fixed type resolution for types inside scopes, but their names omit this information.
-rw-r--r--tests/testnestedtypes.cpp35
-rw-r--r--tests/testnestedtypes.h1
-rw-r--r--typedatabase.cpp23
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