From cf109d6c99edb10f0bea48491ac25760e8cbebf1 Mon Sep 17 00:00:00 2001 From: Mike Arthur Date: Fri, 9 Oct 2009 15:24:35 +0200 Subject: Support global namespace enums and automatically include enum header file. Merge-request: 1714 Reviewed-by: Kent Hansen --- generator/abstractmetabuilder.cpp | 7 +++++ generator/classgenerator.cpp | 58 +++++++++++++++++++++++++++------------ generator/typesystem.h | 4 +++ 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(value)-static_cast(" - << 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 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; -- cgit v1.2.3