comparison generator/dgenerator.cpp @ 368:185df9220ea7

Fixed startsWith. Implemented meta-object members as ranges. Freed QMetaObject from stuff that belongs to MetaClass
author Max Samukha <maxter@maxter.com>
date Mon, 28 Jun 2010 21:29:32 +0300
parents f69341b40588
children a032df77b6ab
comparison
equal deleted inserted replaced
367:f69341b40588 368:185df9220ea7
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 qt.core.QMetaObject;" << endl; 1961 << "public import qt.core.QMetaObject;" << endl
1962 << "import qtd.meta.Runtime;";
1962 1963
1963 if (d_class->name() != "QObject") 1964 if (d_class->name() != "QObject")
1964 s << "public import qt.core.QObject;" << endl; 1965 s << "public import qt.core.QObject;" << endl;
1965 } 1966 }
1966 1967
2564 2565
2565 s << "extern(C) void static_init_" << d_class->name() << "() {" << endl; 2566 s << "extern(C) void static_init_" << d_class->name() << "() {" << endl;
2566 2567
2567 if (d_class->typeEntry()->isValue()) 2568 if (d_class->typeEntry()->isValue())
2568 s << INDENT << d_class->name() << ".QTypeInfo.init();" << endl; 2569 s << INDENT << d_class->name() << ".QTypeInfo.init();" << endl;
2569
2570 if (d_class->isQObject()) {
2571 // ensure meta-object is created at static construction
2572 s << INDENT << d_class->name() << ".staticMetaObject();" << endl;
2573 }
2574 2570
2575 if (cpp_shared && d_class->generateShellClass()) { 2571 if (cpp_shared && d_class->generateShellClass()) {
2576 2572
2577 AbstractMetaFunction::Options opts(AbstractMetaFunction::DeclaringClass | AbstractMetaFunction::NoExternNamespace); 2573 AbstractMetaFunction::Options opts(AbstractMetaFunction::DeclaringClass | AbstractMetaFunction::NoExternNamespace);
2578 2574
2758 s << " int qt_metacall(QMetaObject.Call _c, int _id, void **_a) {" << endl 2754 s << " int qt_metacall(QMetaObject.Call _c, int _id, void **_a) {" << endl
2759 << " return qtd_" << d_class->name() << "_qt_metacall(__nativeId, _c, _id, _a);" << endl 2755 << " return qtd_" << d_class->name() << "_qt_metacall(__nativeId, _c, _id, _a);" << endl
2760 << " }" << endl << endl; 2756 << " }" << endl << endl;
2761 } 2757 }
2762 2758
2763 s << " private static __gshared QMetaObject staticMetaObject_;" << endl 2759 s << " @property QMetaObject metaObject() {" << endl
2764 << " protected static void setStaticMetaObject(QMetaObject m) {" << endl 2760 << " return staticMetaObject;" << endl
2765 << " staticMetaObject_ = m;" << endl
2766 << " }" << endl << endl 2761 << " }" << endl << endl
2767 2762
2768 << " @property QMetaObject metaObject() {" << endl 2763 << " @property static QMetaObject staticMetaObject() {" << endl
2769 << " return staticMetaObject_;" << endl 2764 << " return meta!(" << d_class->name() << ");" << endl
2770 << " }" << endl << endl 2765 << " }" << endl << endl
2771 2766
2772 << " @property static QMetaObject staticMetaObject() {" << endl 2767 << " static " << d_class->name() << " __getObject(void* nativeId) {" << endl
2773 << " if (!staticMetaObject_)" << endl 2768 << " return static_cast!(" << d_class->name() << ")(staticMetaObject.getObject(nativeId));" << endl
2774 << " QMetaObject.create!(typeof(this))(qtd_" << d_class->name() << "_staticMetaObject());" << endl
2775 << " return staticMetaObject_;" << endl
2776 << " }" << endl << endl 2769 << " }" << endl << endl
2777 2770
2778 << " static " << d_class->name() << " __getObject(void* nativeId) {" << endl 2771 << " static void __createEntity(void* nativeId, void* dId) {" << endl
2779 << " return static_cast!(" << d_class->name() << ")(staticMetaObject_.getObject(nativeId));" << endl
2780 << " }" << endl << endl
2781
2782 << " /* internal */ static void __createEntity(void* nativeId, void* dId) {" << endl
2783 << " return qtd_" << d_class->name() << "_createEntity(nativeId, dId);" << endl 2772 << " return qtd_" << d_class->name() << "_createEntity(nativeId, dId);" << endl
2784 << " }" << endl << endl 2773 << " }" << endl << endl
2785 2774
2786 << " /* internal */ static void _populateMetaInfo() {" << endl 2775 << " static void* qtd_nativeStaticMetaObject() {" << endl
2776 << " return qtd_" << d_class->name() << "_staticMetaObject();" << endl
2777 << " }" << endl
2778
2779 << " static void _populateMetaInfo(QMetaObject mo) {" << endl
2787 << " int index;" << endl << endl; 2780 << " int index;" << endl << endl;
2788 2781
2789 AbstractMetaFunctionList signal_funcs = signalFunctions(d_class, false); 2782 AbstractMetaFunctionList signal_funcs = signalFunctions(d_class, false);
2790 2783
2791 int staticId = 0; 2784 int staticId = 0;
2794 int j = 0; 2787 int j = 0;
2795 bool hasDefault = false; 2788 bool hasDefault = false;
2796 do // need this to look for default arguments and generate extra signatures 2789 do // need this to look for default arguments and generate extra signatures
2797 { 2790 {
2798 AbstractMetaFunction *fn = signal_funcs.at(i); 2791 AbstractMetaFunction *fn = signal_funcs.at(i);
2799 s << " index = staticMetaObject_.indexOfMethod_Cpp(__signalSignatures[" << staticId << "]);" << endl 2792 s << " index = mo.indexOfMethod_Cpp(__signalSignatures[" << staticId << "]);" << endl
2800 << " staticMetaObject_.addMethod(new QMetaSignal(signature!("; 2793 << " mo.addMethod(new QMetaSignal(signature!(";
2801 writeMetaMethodArguments(s, fn, j); 2794 writeMetaMethodArguments(s, fn, j);
2802 s << ")(\"" << fn->name() << "\"), index));" << endl << endl; 2795 s << ")(\"" << fn->name() << "\"), index));" << endl << endl;
2803 AbstractMetaArgumentList args = fn->arguments(); 2796 AbstractMetaArgumentList args = fn->arguments();
2804 if(args.size() && j<args.size()) 2797 if(args.size() && j<args.size())
2805 hasDefault = !args.at(args.size() - 1 - j)->defaultValueExpression().isEmpty(); 2798 hasDefault = !args.at(args.size() - 1 - j)->defaultValueExpression().isEmpty();
2816 int j = 0; 2809 int j = 0;
2817 bool hasDefault = false; 2810 bool hasDefault = false;
2818 do // need this to look for default arguments and generate extra signatures 2811 do // need this to look for default arguments and generate extra signatures
2819 { 2812 {
2820 AbstractMetaFunction *fn = slot_funcs.at(i); 2813 AbstractMetaFunction *fn = slot_funcs.at(i);
2821 s << " index = staticMetaObject_.indexOfMethod_Cpp(__slotSignatures[" << staticId << "]);" << endl 2814 s << " index = mo.indexOfMethod_Cpp(__slotSignatures[" << staticId << "]);" << endl
2822 << " staticMetaObject_.addMethod(new QMetaSlot(signature!("; 2815 << " mo.addMethod(new QMetaSlot(signature!(";
2823 writeMetaMethodArguments(s, fn, j); 2816 writeMetaMethodArguments(s, fn, j);
2824 s << ")(\"" << fn->name() << "\"), index));" << endl << endl; 2817 s << ")(\"" << fn->name() << "\"), index));" << endl << endl;
2825 AbstractMetaArgumentList args = fn->arguments(); 2818 AbstractMetaArgumentList args = fn->arguments();
2826 if(args.size() && j<args.size()) 2819 if(args.size() && j<args.size())
2827 hasDefault = !args.at(args.size() - 1 - j)->defaultValueExpression().isEmpty(); 2820 hasDefault = !args.at(args.size() - 1 - j)->defaultValueExpression().isEmpty();