summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Arthur <mike@kdab.net>2009-10-09 15:24:35 +0200
committerKent Hansen <khansen@trolltech.com>2009-10-30 11:11:38 +0100
commitcf109d6c99edb10f0bea48491ac25760e8cbebf1 (patch)
treea25cfab98e65c9063b3b9bf8f198c10bfd8a09c3
parentf4d8d5514d3ad47841c783c4ff2a568303ca764e (diff)
Support global namespace enums and automatically include enum header file.
Merge-request: 1714 Reviewed-by: Kent Hansen <khansen@trolltech.com>
-rw-r--r--generator/abstractmetabuilder.cpp7
-rw-r--r--generator/classgenerator.cpp58
-rw-r--r--generator/typesystem.h4
3 files changed, 51 insertions, 18 deletions
diff --git a/generator/abstractmetabuilder.cpp b/generator/abstractmetabuilder.cpp
index e2ea460..d9ed85c 100644
--- a/generator/abstractmetabuilder.cpp
+++ b/generator/abstractmetabuilder.cpp
@@ -403,6 +403,10 @@ bool AbstractMetaBuilder::build()
global->addEnum(meta_enum);
meta_enum->setEnclosingClass(global);
meta_enum->typeEntry()->setQualifier(globalName);
+
+ // Global enums should be public despite not having public
+ // identifiers so we'll fix the original attributes here.
+ meta_enum->setOriginalAttributes(meta_enum->attributes());
}
@@ -987,6 +991,9 @@ AbstractMetaEnum *AbstractMetaBuilder::traverseEnum(EnumModelItem enum_item, Abs
m_enum_values[meta_enum_value->name()] = meta_enum_value;
}
+ QFileInfo info(enum_item->fileName());
+ meta_enum->typeEntry()->setInclude(Include(Include::IncludePath, info.fileName()));
+
m_enums << meta_enum;
return meta_enum;
diff --git a/generator/classgenerator.cpp b/generator/classgenerator.cpp
index 10cc32f..910a311 100644
--- a/generator/classgenerator.cpp
+++ b/generator/classgenerator.cpp
@@ -727,7 +727,10 @@ static void writeCreateFlagsClassHelper(QTextStream &stream)
static void writeEnumClass(QTextStream &stream, const AbstractMetaClass *meta_class,
const AbstractMetaEnum *enom)
{
- QString qualifiedEnumName = meta_class->qualifiedCppName() + "::" + enom->name();
+ QString qualifiedCppNameColons;
+ if (meta_class->name() != "Global")
+ qualifiedCppNameColons = meta_class->qualifiedCppName() + "::";
+ QString qualifiedEnumName = qualifiedCppNameColons + enom->name();
QString qtScriptEnumName = meta_class->name() + "_" + enom->name();
stream << "//" << endl;
@@ -747,7 +750,7 @@ static void writeEnumClass(QTextStream &stream, const AbstractMetaClass *meta_cl
stream << " ";
if (i > 0)
stream << ", ";
- stream << meta_class->qualifiedCppName() << "::" << values.at(uniqueIndexes.at(i))->name() << endl;
+ stream << qualifiedCppNameColons << values.at(uniqueIndexes.at(i))->name() << endl;
}
stream << "};" << endl << endl;
stream << "static const char * const qtscript_" << qtScriptEnumName << "_keys[] = {" << endl;
@@ -772,13 +775,13 @@ static void writeEnumClass(QTextStream &stream, const AbstractMetaClass *meta_cl
stream << " return QString::fromLatin1(menum.valueToKey(value));" << endl;
} else {
if (contiguous) {
- stream << " if ((value >= " << meta_class->qualifiedCppName()
- << "::" << values.at(uniqueIndexes.first())->name() << ")"
- << " && (value <= " << meta_class->qualifiedCppName()
- << "::" << values.at(uniqueIndexes.last())->name() << "))" << endl
+ stream << " if ((value >= " << qualifiedCppNameColons
+ << values.at(uniqueIndexes.first())->name() << ")"
+ << " && (value <= " << qualifiedCppNameColons
+ << values.at(uniqueIndexes.last())->name() << "))" << endl
<< " return qtscript_" << qtScriptEnumName
<< "_keys[static_cast<int>(value)-static_cast<int>("
- << meta_class->qualifiedCppName() << "::"
+ << qualifiedCppNameColons
<< values.at(uniqueIndexes.first())->name() << ")];" << endl;
} else {
stream << " for (int i = 0; i < " << uniqueIndexes.size() << "; ++i) {" << endl
@@ -824,10 +827,10 @@ static void writeEnumClass(QTextStream &stream, const AbstractMetaClass *meta_cl
<< qualifiedEnumName << ">(arg));" << endl;
} else {
if (contiguous) {
- stream << " if ((arg >= " << meta_class->qualifiedCppName()
- << "::" << values.at(uniqueIndexes.first())->name() << ")"
- << " && (arg <= " << meta_class->qualifiedCppName()
- << "::" << values.at(uniqueIndexes.last())->name() << "))" << endl;
+ stream << " if ((arg >= " << qualifiedCppNameColons
+ << values.at(uniqueIndexes.first())->name() << ")"
+ << " && (arg <= " << qualifiedCppNameColons
+ << values.at(uniqueIndexes.last())->name() << "))" << endl;
stream << " return qScriptValueFromValue(engine, static_cast<"
<< qualifiedEnumName << ">(arg));" << endl;
} else {
@@ -899,7 +902,7 @@ static void writeEnumClass(QTextStream &stream, const AbstractMetaClass *meta_cl
if (!flags)
return;
- QString qualifiedFlagsName = meta_class->qualifiedCppName() + "::" + flags->targetLangName();
+ QString qualifiedFlagsName = qualifiedCppNameColons + flags->targetLangName();
QString qtScriptFlagsName = meta_class->name() + "_" + flags->targetLangName();
stream << "//" << endl;
@@ -1116,9 +1119,12 @@ void declareEnumMetaTypes(QTextStream &stream, const AbstractMetaClass *meta_cla
const AbstractMetaEnum *enom = enums.at(i);
if (shouldIgnoreEnum(enom))
continue;
- maybeDeclareMetaType(stream, QString::fromLatin1("%0::%1")
- .arg(meta_class->qualifiedCppName()).arg(enom->name()),
- registeredTypeNames);
+ if (meta_class->name() == "Global")
+ maybeDeclareMetaType(stream, enom->name(), registeredTypeNames);
+ else
+ maybeDeclareMetaType(stream, QString::fromLatin1("%0::%1")
+ .arg(meta_class->qualifiedCppName()).arg(enom->name()),
+ registeredTypeNames);
FlagsTypeEntry *flags = enom->typeEntry()->flags();
if (flags) {
maybeDeclareMetaType(stream, QString::fromLatin1("QFlags<%0::%1>")
@@ -1440,9 +1446,6 @@ static void writeFunctionSignaturesString(QTextStream &s, const AbstractMetaFunc
*/
void ClassGenerator::write(QTextStream &stream, const AbstractMetaClass *meta_class)
{
- if (meta_class->name() == "Global") // ### hmmmmmm
- return;
-
if (FileOut::license)
writeQtScriptQtBindingsLicense(stream);
@@ -1487,6 +1490,25 @@ void ClassGenerator::write(QTextStream &stream, const AbstractMetaClass *meta_cl
}
}
+ if (meta_class->isNamespace() || meta_class->name() == "Global") {
+ QMap<QString, Include> includes;
+ foreach (AbstractMetaEnum *enom, enums) {
+ Include include = enom->typeEntry()->include();
+ includes.insert(include.toString(), include);
+ }
+
+ foreach (const Include &i, includes) {
+ writeInclude(stream, i);
+ }
+
+ stream << endl;
+ }
+
+ if (meta_class->name() == "Global") {
+ stream << "class Global {};" << endl;
+ stream << endl;
+ }
+
// find constructors
AbstractMetaFunctionList ctors = findConstructors(meta_class);
bool hasDefaultCtor = findDefaultConstructor(ctors) != 0;
diff --git a/generator/typesystem.h b/generator/typesystem.h
index 3a2b5d2..b744e9d 100644
--- a/generator/typesystem.h
+++ b/generator/typesystem.h
@@ -634,6 +634,9 @@ public:
QString jniName() const;
+ Include include() const { return m_include; }
+ void setInclude(const Include &inc) { m_include = inc; }
+
QString qualifier() const { return m_qualifier; }
void setQualifier(const QString &q) { m_qualifier = q; }
@@ -664,6 +667,7 @@ public:
void setForceInteger(bool force) { m_force_integer = force; }
private:
+ Include m_include;
QString m_package_name;
QString m_qualifier;
QString m_java_name;