summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHugo Parente Lima <hugo.pl@gmail.com>2011-08-24 17:54:56 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-09 19:10:19 -0300
commitdfd0bc442d5f3c04d03ee23606b399ed18d304f7 (patch)
tree820d4a362b785918b54b2a85667b715727cc7cf5
parenteef4208e789cff36e5f6a40a49a239d6461f8683 (diff)
Implement getTypeIndex function for types no generated types and primitive types.
Reviewer: Marcelo Lira <marcelo.lira@openbossa.org> Renato Ara├║jo <renato.filho@openbossa.org>
-rw-r--r--tests/CMakeLists.txt10
-rw-r--r--tests/testtypeindex.cpp87
-rw-r--r--tests/testtypeindex.h46
-rw-r--r--tests/typeindex.h7
-rw-r--r--tests/typeindex_1.xml9
-rw-r--r--tests/typeindex_2.xml12
-rw-r--r--typedatabase.cpp60
-rw-r--r--typedatabase.h4
8 files changed, 213 insertions, 22 deletions
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 01c7deb7..75af51d6 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -15,8 +15,7 @@ declare_test(testabstractmetatype)
declare_test(testaddfunction)
declare_test(testarrayargument)
declare_test(testcodeinjection)
-configure_file("${CMAKE_CURRENT_SOURCE_DIR}/utf8code.txt"
- "${CMAKE_CURRENT_BINARY_DIR}/utf8code.txt" COPYONLY)
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/utf8code.txt" "${CMAKE_CURRENT_BINARY_DIR}/utf8code.txt" COPYONLY)
declare_test(testcontainer)
declare_test(testconversionoperator)
declare_test(testconversionruletag)
@@ -41,13 +40,16 @@ declare_test(testremoveoperatormethod)
declare_test(testresolvetype)
declare_test(testreverseoperators)
declare_test(testtemplates)
+declare_test(testtypeindex)
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/typeindex_1.xml" "${CMAKE_CURRENT_BINARY_DIR}/typeindex_1.xml" COPYONLY)
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/typeindex_2.xml" "${CMAKE_CURRENT_BINARY_DIR}/typeindex_2.xml" COPYONLY)
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/typeindex.h" "${CMAKE_CURRENT_BINARY_DIR}/typeindex.h" COPYONLY)
declare_test(testtoposort)
declare_test(testvaluetypedefaultctortag)
declare_test(testvoidarg)
declare_test(testtyperevision)
if (NOT DISABLE_DOCSTRINGS)
declare_test(testmodifydocumentation)
- configure_file("${CMAKE_CURRENT_SOURCE_DIR}/a.xml"
- "${CMAKE_CURRENT_BINARY_DIR}/a.xml" COPYONLY)
+ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/a.xml" "${CMAKE_CURRENT_BINARY_DIR}/a.xml" COPYONLY)
endif()
diff --git a/tests/testtypeindex.cpp b/tests/testtypeindex.cpp
new file mode 100644
index 00000000..e6a76549
--- /dev/null
+++ b/tests/testtypeindex.cpp
@@ -0,0 +1,87 @@
+/*
+* This file is part of the API Extractor project.
+*
+* Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+*
+* Contact: PySide team <contact@pyside.org>
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* version 2 as published by the Free Software Foundation.
+*
+* This program is distributed in the hope that it will be useful, but
+* WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA
+*
+*/
+
+#include "testtypeindex.h"
+#include "abstractmetabuilder.h"
+#include <QtTest/QTest>
+#include "testutil.h"
+#include <QDir>
+
+void TestTypeIndex::initTestCase()
+{
+ m_td = TypeDatabase::instance(true);
+ m_td->addTypesystemPath(QDir::currentPath());
+ QVERIFY(m_td->parseFile("typeindex_1.xml"));
+ QFile cppCode("typeindex.h");
+ bool res = m_builder.build(&cppCode);
+ QVERIFY(res);
+}
+
+void TestTypeIndex::testTypeIndex_data()
+{
+ QTest::addColumn<QString>("typeName");
+ QTest::addColumn<int>("typeIndex");
+
+ QTest::newRow("unsigned int") << "unsigned int" << 0;
+ QTest::newRow("bool") << "bool" << 0;
+ QTest::newRow("P1") << "P1" << 0;
+ QTest::newRow("P2") << "P2" << 0;
+ QTest::newRow("P3") << "P3" << 1;
+ QTest::newRow("Pa4") << "Pa4" << 2;
+ QTest::newRow("Value1") << "Value1" << 0;
+ QTest::newRow("Value2") << "Value2" << 1;
+ QTest::newRow("P4") << "P4" << 0;
+ QTest::newRow("P5") << "P5" << 1;
+ QTest::newRow("Value3") << "Value3" << 0;
+ QTest::newRow("Value4") << "Value4" << 1;
+}
+
+void TestTypeIndex::testTypeIndex()
+{
+ QFETCH(QString, typeName);
+ QFETCH(int, typeIndex);
+
+ TypeEntry* type = m_td->findType(typeName);
+ QVERIFY(type);
+
+ QCOMPARE(getTypeIndex(type), typeIndex);
+}
+
+void TestTypeIndex::testMaxTypeIndex()
+{
+ QCOMPARE(getMaxPrimitiveTypeIndex("Foo"), 2);
+ QCOMPARE(getMaxTypeIndex("Foo"), 1);
+ QCOMPARE(getMaxPrimitiveTypeIndex("Bar"), 1);
+ QCOMPARE(getMaxTypeIndex("Bar"), 1);
+}
+
+void TestTypeIndex::testDeprecatedFunction()
+{
+ // This returns max type index + 1, the new versions return the right value
+ QCOMPARE(getMaxTypeIndex(), 2);
+}
+
+QTEST_APPLESS_MAIN(TestTypeIndex)
+
+#include "testtypeindex.moc"
+
diff --git a/tests/testtypeindex.h b/tests/testtypeindex.h
new file mode 100644
index 00000000..d0327e71
--- /dev/null
+++ b/tests/testtypeindex.h
@@ -0,0 +1,46 @@
+/*
+* This file is part of the API Extractor project.
+*
+* Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+*
+* Contact: PySide team <contact@pyside.org>
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* version 2 as published by the Free Software Foundation.
+*
+* This program is distributed in the hope that it will be useful, but
+* WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA
+*
+*/
+
+#ifndef TESTTYPEINDEX_H
+#define TESTTYPEINDEX_H
+
+#include <QObject>
+#include "abstractmetabuilder.h"
+
+class TypeDatabase;
+class TestTypeIndex : public QObject {
+Q_OBJECT
+
+private slots:
+ void initTestCase();
+ void testTypeIndex_data();
+ void testTypeIndex();
+ void testMaxTypeIndex();
+ void testDeprecatedFunction();
+
+private:
+ AbstractMetaBuilder m_builder;
+ TypeDatabase* m_td;
+};
+
+#endif
diff --git a/tests/typeindex.h b/tests/typeindex.h
new file mode 100644
index 00000000..6205dd8b
--- /dev/null
+++ b/tests/typeindex.h
@@ -0,0 +1,7 @@
+
+struct Value1 {};
+struct Value2 {};
+struct Value3 {};
+struct Value4 {};
+
+typedef unsigned int P1;
diff --git a/tests/typeindex_1.xml b/tests/typeindex_1.xml
new file mode 100644
index 00000000..047987c9
--- /dev/null
+++ b/tests/typeindex_1.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" ?>
+<typesystem package="Bar">
+ <load-typesystem name="typeindex_2.xml" generate="no" />
+ <primitive-type name="P4" />
+ <primitive-type name="P5" />
+
+ <value-type name="Value3" />
+ <value-type name="Value4" />
+</typesystem>
diff --git a/tests/typeindex_2.xml b/tests/typeindex_2.xml
new file mode 100644
index 00000000..f3fde0ae
--- /dev/null
+++ b/tests/typeindex_2.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" ?>
+<typesystem package="Foo">
+ <primitive-type name="unsigned int" />
+ <primitive-type name="bool" />
+ <primitive-type name="P1" />
+ <primitive-type name="P2" />
+ <primitive-type name="P3" revision="1" />
+ <primitive-type name="Pa4" revision="2" />
+
+ <value-type name="Value1" />
+ <value-type name="Value2" />
+</typesystem>
diff --git a/typedatabase.cpp b/typedatabase.cpp
index d5c1eb6c..25933501 100644
--- a/typedatabase.cpp
+++ b/typedatabase.cpp
@@ -430,8 +430,12 @@ void TypeDatabase::setDropTypeEntries(QStringList dropTypeEntries)
// This global variable exists only because we can't break the ABI
typedef QHash<const TypeEntry*, std::pair<int, int> > TypeRevisionMap;
Q_GLOBAL_STATIC(TypeRevisionMap, typeEntryFields);
+// Hash of: packageName -> (max type index found, max primitive type index found)
+typedef QMap<QString, QPair<int, int> > MaxTypeIndexes;
+Q_GLOBAL_STATIC(MaxTypeIndexes, maxTypeIndexes);
static bool computeTypeIndexes = true;
-static int maxTypeIndex;
+// This is kept for API compatibility issues with previous versions
+int oldMaxTypeIndex;
int getTypeRevision(const TypeEntry* typeEntry)
{
@@ -453,39 +457,51 @@ static void _computeTypeIndexes()
{
TypeDatabase* tdb = TypeDatabase::instance();
typedef QMap<int, QList<TypeEntry*> > GroupedTypeEntries;
- GroupedTypeEntries groupedEntries;
+ typedef QHash<QString, GroupedTypeEntries> GroupedPerPackageGroups;
+ GroupedPerPackageGroups groupsPerPackage;
// Group type entries by revision numbers
TypeEntryHash allEntries = tdb->allEntries();
+ QString pkgName;
+ oldMaxTypeIndex = 0;
foreach (QList<TypeEntry*> entryList, allEntries) {
foreach (TypeEntry* entry, entryList) {
- if (entry->isPrimitive()
+ if (entry->isCppPrimitive()
|| entry->isContainer()
|| entry->isFunction()
- || !entry->generateCode()
|| entry->isEnumValue()
|| entry->isVarargs()
|| entry->isTypeSystem()
|| entry->isVoid()
|| entry->isCustom())
continue;
- groupedEntries[getTypeRevision(entry)] << entry;
+
+ if (entry->generateCode() && !entry->isPrimitive())
+ oldMaxTypeIndex++;
+ pkgName = entry->targetLangPackage();
+ groupsPerPackage[pkgName][getTypeRevision(entry)] << entry;
}
}
- maxTypeIndex = 0;
- GroupedTypeEntries::iterator it = groupedEntries.begin();
- for (; it != groupedEntries.end(); ++it) {
- // Remove duplicates
- QList<TypeEntry*>::iterator newEnd = std::unique(it.value().begin(), it.value().end());
- it.value().erase(newEnd, it.value().end());
- // Sort the type entries by name
- qSort(it.value().begin(), newEnd, compareTypeEntriesByName);
-
- foreach (TypeEntry* entry, it.value()) {
- (*typeEntryFields())[entry].second = maxTypeIndex++;
+
+ GroupedPerPackageGroups::iterator pkg = groupsPerPackage.begin();
+ for (; pkg != groupsPerPackage.end() ; ++pkg) {
+ GroupedTypeEntries::iterator it = pkg.value().begin();
+ for (; it != pkg.value().end(); ++it) {
+ // Remove duplicates
+ QList<TypeEntry*>::iterator newEnd = std::unique(it.value().begin(), it.value().end());
+ it.value().erase(newEnd, it.value().end());
+ // Sort the type entries by name
+ qSort(it.value().begin(), newEnd, compareTypeEntriesByName);
+
+ foreach (TypeEntry* entry, it.value()) {
+ QPair<int, int>& pair = (*maxTypeIndexes())[pkg.key()];
+ int value = entry->isPrimitive() ? pair.second++ : pair.first++;
+ (*typeEntryFields())[entry].second = value;
+ }
}
}
+
computeTypeIndexes = false;
}
@@ -500,7 +516,17 @@ int getMaxTypeIndex()
{
if (computeTypeIndexes)
_computeTypeIndexes();
- return maxTypeIndex;
+ return oldMaxTypeIndex;
+}
+
+int getMaxTypeIndex(const QString& packageName)
+{
+ return maxTypeIndexes()->value(packageName).first - 1;
+}
+
+int getMaxPrimitiveTypeIndex(const QString& packageName)
+{
+ return maxTypeIndexes()->value(packageName).second - 1;
}
void TypeDatabase::setApiVersion(const QString& package, const QByteArray& version)
diff --git a/typedatabase.h b/typedatabase.h
index 8c735c1c..229da082 100644
--- a/typedatabase.h
+++ b/typedatabase.h
@@ -30,7 +30,9 @@
APIEXTRACTOR_API void setTypeRevision(TypeEntry* typeEntry, int revision);
APIEXTRACTOR_API int getTypeRevision(const TypeEntry* typeEntry);
APIEXTRACTOR_API int getTypeIndex(const TypeEntry* typeEntry);
-APIEXTRACTOR_API int getMaxTypeIndex();
+APIEXTRACTOR_API APIEXTRACTOR_DEPRECATED(int getMaxTypeIndex());
+APIEXTRACTOR_API int getMaxTypeIndex(const QString& packageName);
+APIEXTRACTOR_API int getMaxPrimitiveTypeIndex(const QString& packageName);
class ContainerTypeEntry;
class PrimitiveTypeEntry;