changeset 341:4920ef9206fe

moved enums into interfaces
author Max Samukha <maxter@spambox.com>
date Thu, 13 May 2010 16:39:41 +0300
parents 9fc85d7280ba
children c887282e1590
files generator/dgenerator.cpp generator/dgenerator.h generator/typesystem.cpp
diffstat 3 files changed, 33 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/generator/dgenerator.cpp	Mon May 10 13:29:50 2010 +0300
+++ b/generator/dgenerator.cpp	Thu May 13 16:39:41 2010 +0300
@@ -286,23 +286,23 @@
     s << "    } // end of enum " << d_enum->name() << endl << endl;
 }
 
-void DGenerator::writeEnumAlias(QTextStream &s, const AbstractMetaEnum *d_enum)
+void DGenerator::writeEnumAliases(QTextStream &s, const AbstractMetaEnum *d_enum)
 {
-    // aliases for enums to be used in easier way like QFont.Bold instead of QFont.Weight.Bold
-    //s << QString("    alias %1 %2;").arg(d_enum->typeEntry()->qualifiedTargetLangName()).arg(d_enum->name()) << endl << endl;
+    FlagsTypeEntry *flags = d_enum->typeEntry()->flags();
+    if (flags)
+        s << INDENT << "alias " << d_enum->name() << " " << flags->targetLangName() << ";" << endl << endl;
+
     const AbstractMetaEnumValueList &values = d_enum->values();
     for (int i=0; i<values.size(); ++i) {
         AbstractMetaEnumValue *enum_value = values.at(i);
 
-        if (d_enum->typeEntry()->isEnumValueRejected(enum_value->name()))
-            continue;
-
-        s << QString("    alias %1.%2 %2;").arg(d_enum->name()).arg(enum_value->name()) << endl;
+        if (!d_enum->typeEntry()->isEnumValueRejected(enum_value->name()))
+            s << INDENT << QString("alias %1.%2 %2;").arg(d_enum->name()).arg(enum_value->name()) << endl;
     }
     s << endl;
 }
 
-void DGenerator::writeEnum(QTextStream &s, const AbstractMetaEnum *d_enum)
+void DGenerator::writeEnum(QTextStream &s, const AbstractMetaEnum *d_enum, bool withAliases)
 {
     if (m_doc_parser) {
         s << m_doc_parser->documentation(d_enum);
@@ -322,11 +322,13 @@
     }
 */
     // Generates Java 1.5 type enums
-    s << "public enum " << d_enum->name() << " {" << endl;
+    s << INDENT << "public enum " << d_enum->name() << " {" << endl;
     const AbstractMetaEnumValueList &values = d_enum->values();
     EnumTypeEntry *entry = d_enum->typeEntry();
 
+
     for (int i=0; i<values.size(); ++i) {
+        Indentation indent(INDENT);
         AbstractMetaEnumValue *enum_value = values.at(i);
 
         if (d_enum->typeEntry()->isEnumValueRejected(enum_value->name()))
@@ -335,7 +337,7 @@
         if (m_doc_parser)
             s << m_doc_parser->documentation(enum_value);
 
-        s << "        " << enum_value->name() << " = " << enum_value->value();
+        s << INDENT << enum_value->name() << " = " << enum_value->value();
 
         if (i != values.size() - 1) {
             AbstractMetaEnumValue *next_value = values.at(i+1); // qtd
@@ -418,6 +420,9 @@
         QString flagsName = flags_entry->targetLangName();
         s << INDENT << "alias QFlags!(" << d_enum->name() << ") " << flagsName << ";" << endl << endl;
     }*/
+
+    if (withAliases)
+        writeEnumAliases(s, d_enum);
 }
 
 void DGenerator::writePrivateNativeFunction(QTextStream &s, const AbstractMetaFunction *d_function)
@@ -894,7 +899,7 @@
             s << INDENT << "this." << function_call_for_ownership(owner) << ";" << endl;
     }
 
-    // return value marschalling
+    // return value marshalling
     if(return_type) {
         if (!returnImmediately) {
             s << INDENT;
@@ -1785,8 +1790,6 @@
                       << INDENT << "string " << arg_name << " = QStringUtil.toNativeString(" << arg_name << "_ptr);";
                 } else if(type->isPrimitive() || type->isEnum() || type->isFlags() || type->typeEntry()->isStructInD()) {
                     QString type_name = argument->type()->typeEntry()->qualifiedTargetLangName();
-                    if (type->isFlags())
-                        type_name = "int";
                     s << INDENT << "auto " << arg_name << " = *(cast(" << type_name << "*)" << arg_ptr << ");";
                 } else if(type->isObject() || type->isQObject()
                         || (type->typeEntry()->isValue() && type->isNativePointer())
@@ -2107,9 +2110,15 @@
     Indentation indent(INDENT);
 
     // Enums
-    if (!d_class->enums().isEmpty()) {
+    if (!d_class->typeEntry()->designatedInterface() && !d_class->enums().isEmpty()) {
         foreach (AbstractMetaEnum *d_enum, d_class->enums())
-            writeEnum(s, d_enum);
+            writeEnum(s, d_enum, true);
+    }
+
+    // Enums in designated interfaces
+    if (d_class->isInterface() && d_class->primaryInterfaceImplementor()) {
+        foreach (AbstractMetaEnum *d_enum, d_class->primaryInterfaceImplementor()->enums())
+            writeEnum(s, d_enum, true);
     }
 
     // Define variables for reference count mechanism
@@ -2198,10 +2207,6 @@
     }
 */
 
-    // Enums aliases
-    foreach (AbstractMetaEnum *d_enum, d_class->enums())
-        writeEnumAlias(s, d_enum);
-
     // Signals
     if (d_class->isQObject())
     {
@@ -2603,7 +2608,6 @@
         m_isRecursive = false;
     }
 
-
     if (d_class->isQObject())
         writeQObjectFreeFunctions(s, d_class);
 
--- a/generator/dgenerator.h	Mon May 10 13:29:50 2010 +0300
+++ b/generator/dgenerator.h	Thu May 13 16:39:41 2010 +0300
@@ -47,6 +47,7 @@
 #include "cppimplgenerator.h"
 
 #include <QTextStream>
+#include <QStack>
 
 class DocParser;
 
@@ -69,7 +70,7 @@
     static QString argumentString(const AbstractMetaFunction *d_function,
                                   const AbstractMetaArgument *d_argument,
                                   uint options = 0);
-    void writeEnum(QTextStream &s, const AbstractMetaEnum *d_enum);
+    void writeEnum(QTextStream &s, const AbstractMetaEnum *d_enum, bool withAliases = false);
     void writeIntegerEnum(QTextStream &s, const AbstractMetaEnum *d_enum);
     void writeSignal(QTextStream &s, const AbstractMetaFunction *d_function);
     void writeFunction(QTextStream &s, const AbstractMetaFunction *d_function,
@@ -154,7 +155,7 @@
     void writeDestructor(QTextStream &s, const AbstractMetaClass *d_class);
     void writeFlagsSetter(QTextStream &s, const AbstractMetaClass *d_class);
     void writeSignalHandlers(QTextStream &s, const AbstractMetaClass *d_class);
-    void writeEnumAlias(QTextStream &s, const AbstractMetaEnum *d_enum);
+    void writeEnumAliases(QTextStream &s, const AbstractMetaEnum *d_enum);
     void writeSignalSignatures(QTextStream &s, const AbstractMetaClass *d_class, AbstractMetaFunctionList signal_funcs);
     void writeMetaMethodArguments(QTextStream &s, const AbstractMetaFunction *d_function, int reduce = -1);
     void writeQObjectFunctions(QTextStream &s, const AbstractMetaClass *d_class);
@@ -167,6 +168,7 @@
 
     int m_recursive;
     bool m_isRecursive;
+    QStack<const AbstractMetaClass*> m_recursionStack;
     QSet<const TypeEntry*> typeEntries; // imports
     QSet<const TypeEntry*> typeEntriesEnums; // imports for enums
     QSet<QString> excludedTypes2;
--- a/generator/typesystem.cpp	Mon May 10 13:29:50 2010 +0300
+++ b/generator/typesystem.cpp	Thu May 13 16:39:41 2010 +0300
@@ -1720,8 +1720,12 @@
 QString EnumTypeEntry::javaQualifier() const
 {
     TypeEntry *te = TypeDatabase::instance()->findType(m_qualifier);
-    if (te != 0)
+    if (te != 0) {
+        if (te->designatedInterface())
+            te = te->designatedInterface();
+
         return te->targetLangName();
+    }
     else
         return m_qualifier;
 }