aboutsummaryrefslogtreecommitdiffstats
path: root/typesystem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'typesystem.cpp')
-rw-r--r--typesystem.cpp39
1 files changed, 39 insertions, 0 deletions
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) {