diff options
-rw-r--r-- | typedatabase.cpp | 11 | ||||
-rw-r--r-- | typedatabase.h | 15 | ||||
-rw-r--r-- | typesystem.cpp | 39 | ||||
-rw-r--r-- | typesystem_p.h | 1 |
4 files changed, 66 insertions, 0 deletions
diff --git a/typedatabase.cpp b/typedatabase.cpp index d97959820..4e0ab5b80 100644 --- a/typedatabase.cpp +++ b/typedatabase.cpp @@ -401,3 +401,14 @@ bool TypeDatabase::supportedApiVersion(double version) const return version <= m_apiVersion; } +bool TypeDatabase::shouldDropTypeEntry(const QString& fullTypeName) const +{ + return m_dropTypeEntries.contains(fullTypeName); +} + +void TypeDatabase::setDropTypeEntries(QStringList dropTypeEntries) +{ + m_dropTypeEntries = dropTypeEntries; + m_dropTypeEntries.sort(); +} + diff --git a/typedatabase.h b/typedatabase.h index ff7ffc303..583813882 100644 --- a/typedatabase.h +++ b/typedatabase.h @@ -180,6 +180,20 @@ public: bool supportedApiVersion(double version) const; + const QStringList& dropTypeEntries() const + { + return m_dropTypeEntries; + } + + bool hasDroppedTypeEntries() const + { + return !m_dropTypeEntries.isEmpty(); + } + + bool shouldDropTypeEntry(const QString& fullTypeName) const; + + void setDropTypeEntries(QStringList dropTypeEntries); + private: bool m_suppressWarnings; TypeEntryHash m_entries; @@ -199,6 +213,7 @@ private: QStringList m_rebuildClasses; double m_apiVersion; + QStringList m_dropTypeEntries; }; #endif diff --git a/typesystem.cpp b/typesystem.cpp index 93e81eaa9..3ccb33543 100644 --- a/typesystem.cpp +++ b/typesystem.cpp @@ -38,6 +38,7 @@ Handler::Handler(TypeDatabase* database, bool generate) { m_currentEnum = 0; m_current = 0; + m_currentOptional = 0; tagNames["rejection"] = StackElement::Rejection; tagNames["primitive-type"] = StackElement::PrimitiveTypeEntry; @@ -123,6 +124,13 @@ void Handler::fetchAttributeValues(const QString &name, const QXmlAttributes &at bool Handler::endElement(const QString &, const QString &localName, const QString &) { + if (m_currentOptional) { + m_current = m_currentOptional->parent; + delete m_currentOptional; + m_currentOptional = 0; + return true; + } + QString tagName = localName.toLower(); if (tagName == "import-file") return true; @@ -208,6 +216,9 @@ bool Handler::endElement(const QString &, const QString &localName, const QStrin bool Handler::characters(const QString &ch) { + if (m_currentOptional) + return true; + if (m_current->type == StackElement::Template) { m_current->value.templateEntry->addCode(ch); return true; @@ -345,6 +356,21 @@ static bool convertRemovalAttribute(const QString& removalAttribute, Modificatio return true; } +static void getNamePrefixRecursive(StackElement* element, QStringList& names) +{ + if (!element->parent || !element->parent->entry) + return; + getNamePrefixRecursive(element->parent, names); + names << element->parent->entry->name(); +} + +static QString getNamePrefix(StackElement* element) +{ + QStringList names; + getNamePrefixRecursive(element, names); + return names.join("."); +} + bool Handler::startElement(const QString &, const QString &n, const QString &, const QXmlAttributes &atts) { @@ -357,6 +383,9 @@ bool Handler::startElement(const QString &, const QString &n, return false; } + if (m_currentOptional) + return true; + StackElement* element = new StackElement(m_current); element->type = tagNames[tagName]; @@ -428,6 +457,16 @@ bool Handler::startElement(const QString &, const QString &n, QString name = attributes["name"]; double since = attributes["since"].toDouble(); + if (m_database->hasDroppedTypeEntries()) { + QString identifier = getNamePrefix(element) + '.'; + identifier += (element->type == StackElement::FunctionTypeEntry ? attributes["signature"] : name); + if (m_database->shouldDropTypeEntry(identifier)) { + m_currentOptional = element; + ReportHandler::debugSparse(QString("Optional type system entry '%1' was dropped from generation.").arg(identifier)); + return true; + } + } + // The top level tag 'function' has only the 'signature' tag // and we should extract the 'name' value from it. if (element->type == StackElement::FunctionTypeEntry) { diff --git a/typesystem_p.h b/typesystem_p.h index e70a4fa4c..97859425a 100644 --- a/typesystem_p.h +++ b/typesystem_p.h @@ -149,6 +149,7 @@ private: TypeDatabase* m_database; StackElement* m_current; + StackElement* m_currentOptional; QString m_defaultPackage; QString m_defaultSuperclass; QString m_error; |