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();