Mercurial > projects > qtd
comparison generator/dgenerator.cpp @ 364:a084e2df3776
Preparing for non-QObject meta-objects. Now meta-objects for static types can be uniformly accessed using meta!T
author | Max Samukha <maxter@maxter.com> |
---|---|
date | Fri, 11 Jun 2010 12:16:09 +0300 |
parents | 3b0545d4d479 |
children | 958e8b9a89bd |
comparison
equal
deleted
inserted
replaced
363:3b0545d4d479 | 364:a084e2df3776 |
---|---|
1956 << "private import qtd.Array;" << endl | 1956 << "private import qtd.Array;" << endl |
1957 << "private import qt.core.QList;" << endl; | 1957 << "private import qt.core.QList;" << endl; |
1958 if (d_class->isQObject()) { | 1958 if (d_class->isQObject()) { |
1959 s << "public import qtd.Signal;" << endl | 1959 s << "public import qtd.Signal;" << endl |
1960 << "public import qtd.MOC;" << endl | 1960 << "public import qtd.MOC;" << endl |
1961 << "public import qtd.Traits;" << endl | 1961 << "public import qtd.Traits;" << endl |
1962 << "public import qt.core.QMetaObject;" << endl; | 1962 << "public import qt.core.QMetaObject;" << endl |
1963 << "import qtd.meta.Runtime;" << endl; | |
1963 | 1964 |
1964 if (d_class->name() != "QObject") | 1965 if (d_class->name() != "QObject") |
1965 s << "public import qt.core.QObject;" << endl; | 1966 s << "public import qt.core.QObject;" << endl; |
1966 } | 1967 } |
1967 | 1968 |
2566 s << "extern(C) void static_init_" << d_class->name() << "() {" << endl; | 2567 s << "extern(C) void static_init_" << d_class->name() << "() {" << endl; |
2567 | 2568 |
2568 if (d_class->typeEntry()->isValue()) | 2569 if (d_class->typeEntry()->isValue()) |
2569 s << INDENT << d_class->name() << ".QTypeInfo.init();" << endl; | 2570 s << INDENT << d_class->name() << ".QTypeInfo.init();" << endl; |
2570 | 2571 |
2571 if (d_class->isQObject()) { | |
2572 // ensure meta-object is created at static construction | |
2573 s << INDENT << d_class->name() << ".staticMetaObject();" << endl; | |
2574 } | |
2575 | |
2576 if (cpp_shared && d_class->generateShellClass()) { | 2572 if (cpp_shared && d_class->generateShellClass()) { |
2577 | 2573 |
2578 AbstractMetaFunction::Options opts(AbstractMetaFunction::DeclaringClass | AbstractMetaFunction::NoExternNamespace); | 2574 AbstractMetaFunction::Options opts(AbstractMetaFunction::DeclaringClass | AbstractMetaFunction::NoExternNamespace); |
2579 | 2575 |
2580 // virtual functions | 2576 // virtual functions |
2692 s << "}" << endl << endl; | 2688 s << "}" << endl << endl; |
2693 } | 2689 } |
2694 | 2690 |
2695 void DGenerator::writeQObjectFreeFunctions(QTextStream &s, const AbstractMetaClass *d_class) | 2691 void DGenerator::writeQObjectFreeFunctions(QTextStream &s, const AbstractMetaClass *d_class) |
2696 { | 2692 { |
2697 s << "extern(C) QMetaObjectNative* qtd_" << d_class->name() << "_staticMetaObject();" << endl << endl | 2693 s << "extern(C) void* qtd_" << d_class->name() << "_staticMetaObject();" << endl << endl |
2698 << "extern(C) void qtd_" << d_class->name() << "_createEntity(void* nativeId, void* dId);" << endl << endl | 2694 << "extern(C) void qtd_" << d_class->name() << "_createEntity(void* nativeId, void* dId);" << endl << endl |
2699 << "extern(C) int qtd_" << d_class->name() << "_qt_metacall(void *nativeId, QMetaObject.Call _c, int _id, void **_a);" << endl; | 2695 << "extern(C) int qtd_" << d_class->name() << "_qt_metacall(void *nativeId, QMetaObject.Call _c, int _id, void **_a);" << endl; |
2700 | 2696 |
2701 QString prefix = cpp_shared ? "qtd_export_" : "qtd_"; | 2697 QString prefix = cpp_shared ? "qtd_export_" : "qtd_"; |
2702 | 2698 |
2759 s << " int qt_metacall(QMetaObject.Call _c, int _id, void **_a) {" << endl | 2755 s << " int qt_metacall(QMetaObject.Call _c, int _id, void **_a) {" << endl |
2760 << " return qtd_" << d_class->name() << "_qt_metacall(__nativeId, _c, _id, _a);" << endl | 2756 << " return qtd_" << d_class->name() << "_qt_metacall(__nativeId, _c, _id, _a);" << endl |
2761 << " }" << endl << endl; | 2757 << " }" << endl << endl; |
2762 } | 2758 } |
2763 | 2759 |
2764 s << " private static __gshared QMetaObject staticMetaObject_;" << endl | 2760 s << " @property static void* qtd_nativeMetaObject() {" << endl |
2765 << " protected static void setStaticMetaObject(QMetaObject m) {" << endl | 2761 << " return qtd_" << d_class->name() << "_staticMetaObject();" << endl |
2766 << " staticMetaObject_ = m;" << endl | 2762 << " }" |
2763 | |
2764 << " @property QMetaObject metaObject() {" << endl | |
2765 << " return staticMetaObject;" << endl | |
2767 << " }" << endl << endl | 2766 << " }" << endl << endl |
2768 | 2767 |
2769 << " @property QMetaObject metaObject() {" << endl | 2768 << " @property static QMetaObject staticMetaObject() {" << endl |
2770 << " return staticMetaObject_;" << endl | 2769 << " return meta!(typeof(this));" << endl |
2771 << " }" << endl << endl | 2770 << " }" << endl << endl |
2772 | 2771 |
2773 << " @property static QMetaObject staticMetaObject() {" << endl | 2772 << " static " << d_class->name() << " __getObject(void* nativeId) {" << endl |
2774 << " if (!staticMetaObject_)" << endl | 2773 << " return static_cast!(" << d_class->name() << ")(staticMetaObject.getObject(nativeId));" << endl |
2775 << " QMetaObject.create!(typeof(this))(qtd_" << d_class->name() << "_staticMetaObject());" << endl | |
2776 << " return staticMetaObject_;" << endl | |
2777 << " }" << endl << endl | 2774 << " }" << endl << endl |
2778 | 2775 |
2779 << " static " << d_class->name() << " __getObject(void* nativeId) {" << endl | 2776 << " static void __createEntity(void* nativeId, void* dId) {" << endl |
2780 << " return static_cast!(" << d_class->name() << ")(staticMetaObject_.getObject(nativeId));" << endl | |
2781 << " }" << endl << endl | |
2782 | |
2783 << " /* internal */ static void __createEntity(void* nativeId, void* dId) {" << endl | |
2784 << " return qtd_" << d_class->name() << "_createEntity(nativeId, dId);" << endl | 2777 << " return qtd_" << d_class->name() << "_createEntity(nativeId, dId);" << endl |
2785 << " }" << endl << endl | 2778 << " }" << endl << endl |
2786 | 2779 |
2787 << " /* internal */ static void _populateMetaInfo() {" << endl | 2780 << " static void _populateMetaInfo() {" << endl |
2788 << " int index;" << endl << endl; | 2781 << " int index;" << endl |
2782 << " auto mo = staticMetaObject;" << endl << endl; | |
2789 | 2783 |
2790 AbstractMetaFunctionList signal_funcs = signalFunctions(d_class, false); | 2784 AbstractMetaFunctionList signal_funcs = signalFunctions(d_class, false); |
2791 | 2785 |
2792 int staticId = 0; | 2786 int staticId = 0; |
2793 for (int i = 0; i < signal_funcs.size(); ++i) | 2787 for (int i = 0; i < signal_funcs.size(); ++i) |
2795 int j = 0; | 2789 int j = 0; |
2796 bool hasDefault = false; | 2790 bool hasDefault = false; |
2797 do // need this to look for default arguments and generate extra signatures | 2791 do // need this to look for default arguments and generate extra signatures |
2798 { | 2792 { |
2799 AbstractMetaFunction *fn = signal_funcs.at(i); | 2793 AbstractMetaFunction *fn = signal_funcs.at(i); |
2800 s << " index = staticMetaObject_.indexOfMethod_Cpp(__signalSignatures[" << staticId << "]);" << endl | 2794 s << " index = mo.indexOfMethod_Cpp(__signalSignatures[" << staticId << "]);" << endl |
2801 << " staticMetaObject_.addMethod(new QMetaSignal(signature!("; | 2795 << " mo.addMethod(new QMetaSignal(signature!("; |
2802 writeMetaMethodArguments(s, fn, j); | 2796 writeMetaMethodArguments(s, fn, j); |
2803 s << ")(\"" << fn->name() << "\"), index));" << endl << endl; | 2797 s << ")(\"" << fn->name() << "\"), index));" << endl << endl; |
2804 AbstractMetaArgumentList args = fn->arguments(); | 2798 AbstractMetaArgumentList args = fn->arguments(); |
2805 if(args.size() && j<args.size()) | 2799 if(args.size() && j<args.size()) |
2806 hasDefault = !args.at(args.size() - 1 - j)->defaultValueExpression().isEmpty(); | 2800 hasDefault = !args.at(args.size() - 1 - j)->defaultValueExpression().isEmpty(); |
2817 int j = 0; | 2811 int j = 0; |
2818 bool hasDefault = false; | 2812 bool hasDefault = false; |
2819 do // need this to look for default arguments and generate extra signatures | 2813 do // need this to look for default arguments and generate extra signatures |
2820 { | 2814 { |
2821 AbstractMetaFunction *fn = slot_funcs.at(i); | 2815 AbstractMetaFunction *fn = slot_funcs.at(i); |
2822 s << " index = staticMetaObject_.indexOfMethod_Cpp(__slotSignatures[" << staticId << "]);" << endl | 2816 s << " index = mo.indexOfMethod_Cpp(__slotSignatures[" << staticId << "]);" << endl |
2823 << " staticMetaObject_.addMethod(new QMetaSlot(signature!("; | 2817 << " mo.addMethod(new QMetaSlot(signature!("; |
2824 writeMetaMethodArguments(s, fn, j); | 2818 writeMetaMethodArguments(s, fn, j); |
2825 s << ")(\"" << fn->name() << "\"), index));" << endl << endl; | 2819 s << ")(\"" << fn->name() << "\"), index));" << endl << endl; |
2826 AbstractMetaArgumentList args = fn->arguments(); | 2820 AbstractMetaArgumentList args = fn->arguments(); |
2827 if(args.size() && j<args.size()) | 2821 if(args.size() && j<args.size()) |
2828 hasDefault = !args.at(args.size() - 1 - j)->defaultValueExpression().isEmpty(); | 2822 hasDefault = !args.at(args.size() - 1 - j)->defaultValueExpression().isEmpty(); |