aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2017-03-16 15:23:47 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2017-03-16 15:46:43 +0000
commit3813dbae665507eaa5efb3129ced6835895b3fe5 (patch)
tree9fb67296248ad755b515091cf2dae92b570800ea
parentba23f0439bdb226c9756e62d2e4873270a6bae83 (diff)
TypeDatabase: Make it possible to specify enumeration flags as comma-separated list
Split out the code adding the flags and loop over the list. In typesystem_core_common.xml, there is currently: <enum-type name="ComponentFormattingOption" flags="ComponentFormattingOptions" flags="FormattingOptions"/> which is invalid XML. This can then be specified as: <enum-type name="ComponentFormattingOption" flags="ComponentFormattingOptions,FormattingOptions"/> Change-Id: Ia55b34fb0a72891a15f7f6e3684b41fec8d72f4b Reviewed-by: Christian Tismer <tismer@stackless.com> Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
-rw-r--r--ApiExtractor/typesystem.cpp80
-rw-r--r--ApiExtractor/typesystem_p.h2
2 files changed, 45 insertions, 37 deletions
diff --git a/ApiExtractor/typesystem.cpp b/ApiExtractor/typesystem.cpp
index fb5f1bc..79156cd 100644
--- a/ApiExtractor/typesystem.cpp
+++ b/ApiExtractor/typesystem.cpp
@@ -38,6 +38,8 @@ static QString strings_char = QLatin1String("char");
static QString strings_jchar = QLatin1String("jchar");
static QString strings_jobject = QLatin1String("jobject");
+static inline QString colonColon() { return QStringLiteral("::"); }
+
static QList<CustomConversion*> customConversionsForReview = QList<CustomConversion*>();
Handler::Handler(TypeDatabase* database, bool generate)
@@ -461,6 +463,40 @@ static QString checkSignatureError(const QString& signature, const QString& tag)
return QString();
}
+void Handler::addFlags(const QString &name, QString flagName,
+ const QHash<QString, QString> &attributes, double since)
+{
+ FlagsTypeEntry *ftype = new FlagsTypeEntry(QLatin1String("QFlags<") + name + QLatin1Char('>'), since);
+ ftype->setOriginator(m_currentEnum);
+ // Try to get the guess the qualified flag name
+ const int lastSepPos = name.lastIndexOf(colonColon());
+ if (lastSepPos >= 0 && !flagName.contains(colonColon()))
+ flagName.prepend(name.left(lastSepPos + 2));
+
+ ftype->setOriginalName(flagName);
+ ftype->setCodeGeneration(m_generate);
+ QString n = ftype->originalName();
+
+ QStringList lst = n.split(colonColon());
+ if (QStringList(lst.mid(0, lst.size() - 1)).join(colonColon()) != m_currentEnum->targetLangQualifier()) {
+ qCWarning(lcShiboken).noquote().nospace()
+ << QStringLiteral("enum %1 and flags %2 differ in qualifiers")
+ // avoid constFirst to stay Qt 5.5 compatible
+ .arg(m_currentEnum->targetLangQualifier(), lst.first());
+ }
+
+ ftype->setFlagsName(lst.last());
+ m_currentEnum->setFlags(ftype);
+
+ m_database->addFlagsType(ftype);
+ m_database->addType(ftype);
+
+ QString revision = attributes.value(QLatin1String("flags-revision"));
+ if (revision.isEmpty())
+ revision = attributes.value(QLatin1String("revision"));
+ setTypeRevision(ftype, revision.toInt());
+}
+
bool Handler::startElement(const QString &, const QString &n,
const QString &, const QXmlAttributes &atts)
{
@@ -634,7 +670,7 @@ bool Handler::startElement(const QString &, const QString &n,
// Fix type entry name using nesting information.
if (element->type & StackElement::TypeEntryMask
&& element->parent && element->parent->type != StackElement::Root) {
- name = element->parent->entry->name() + QLatin1String("::") + name;
+ name = element->parent->entry->name() + colonColon() + name;
}
@@ -696,12 +732,12 @@ bool Handler::startElement(const QString &, const QString &n,
break;
case StackElement::EnumTypeEntry: {
- QStringList names = name.split(QLatin1String("::"));
+ QStringList names = name.split(colonColon());
if (names.size() == 1)
m_currentEnum = new EnumTypeEntry(QString(), name, since);
else
m_currentEnum =
- new EnumTypeEntry(QStringList(names.mid(0, names.size() - 1)).join(QLatin1String("::")),
+ new EnumTypeEntry(QStringList(names.mid(0, names.size() - 1)).join(colonColon()),
names.last(), since);
m_currentEnum->setAnonymous(!attributes[QLatin1String("identified-by-value")].isEmpty());
element->entry = m_currentEnum;
@@ -713,40 +749,10 @@ bool Handler::startElement(const QString &, const QString &n,
m_currentEnum->setExtensible(convertBoolean(attributes[QLatin1String("extensible")], QLatin1String("extensible"), false));
// put in the flags parallel...
- QString flagName = attributes[QLatin1String("flags")];
- if (!flagName.isEmpty()) {
- FlagsTypeEntry *ftype = new FlagsTypeEntry(QLatin1String("QFlags<") + name + QLatin1Char('>'), since);
- ftype->setOriginator(m_currentEnum);
- // Try to get the guess the qualified flag name
- if (!flagName.contains(QLatin1String("::")) && names.count() > 1) {
- QStringList cpy(names);
- cpy.removeLast();
- cpy.append(flagName);
- flagName = cpy.join(QLatin1String("::"));
- }
-
- ftype->setOriginalName(flagName);
- ftype->setCodeGeneration(m_generate);
- QString n = ftype->originalName();
-
- QStringList lst = n.split(QLatin1String("::"));
- if (QStringList(lst.mid(0, lst.size() - 1)).join(QLatin1String("::")) != m_currentEnum->targetLangQualifier()) {
- qCWarning(lcShiboken).noquote().nospace()
- << QStringLiteral("enum %1 and flags %2 differ in qualifiers")
- // avoid constFirst to stay Qt 5.5 compatible
- .arg(m_currentEnum->targetLangQualifier(), lst.first());
- }
-
- ftype->setFlagsName(lst.last());
- m_currentEnum->setFlags(ftype);
-
- m_database->addFlagsType(ftype);
- m_database->addType(ftype);
-
- QString revision = attributes[QLatin1String("flags-revision")].isEmpty()
- ? attributes[QLatin1String("revision")]
- : attributes[QLatin1String("flags-revision")];
- setTypeRevision(ftype, revision.toInt());
+ const QString flagNames = attributes[QLatin1String("flags")];
+ if (!flagNames.isEmpty()) {
+ foreach (const QString &flagName, flagNames.split(QLatin1Char(',')))
+ addFlags(name, flagName.trimmed(), attributes, since);
}
}
break;
diff --git a/ApiExtractor/typesystem_p.h b/ApiExtractor/typesystem_p.h
index d6d16d1..a41f6cd 100644
--- a/ApiExtractor/typesystem_p.h
+++ b/ApiExtractor/typesystem_p.h
@@ -155,6 +155,8 @@ private:
bool importFileElement(const QXmlAttributes &atts);
bool convertBoolean(const QString &, const QString &, bool);
+ void addFlags(const QString &name, QString flagName,
+ const QHash<QString, QString> &attributes, double since);
TypeDatabase* m_database;
StackElement* m_current;