comparison generator/dgenerator.cpp @ 270:49bfc86ff583

true emit of Qt signals.
author eldar
date Thu, 24 Sep 2009 12:59:48 +0000
parents 073b9153ed8a
children 519befd5a5d1
comparison
equal deleted inserted replaced
269:cc9080066035 270:49bfc86ff583
982 // The actual function 982 // The actual function
983 if (!(d_function->isEmptyFunction() || d_function->isNormal() || d_function->isSignal())) 983 if (!(d_function->isEmptyFunction() || d_function->isNormal() || d_function->isSignal()))
984 option = Option(option | SkipReturnType); 984 option = Option(option | SkipReturnType);
985 writeFunctionAttributes(s, d_function, included_attributes, excluded_attributes, option); 985 writeFunctionAttributes(s, d_function, included_attributes, excluded_attributes, option);
986 986
987 if(d_function->isSignal())
988 functionName += "_emit";
989
987 s << functionName << "("; 990 s << functionName << "(";
988 writeFunctionArguments(s, d_function, argument_count, option); 991 writeFunctionArguments(s, d_function, argument_count, option);
989 s << ")"; 992 s << ")";
990 993
991 return result; 994 return result;
1744 1747
1745 QString arg_ptr = QString("args[%1]").arg(argument->argumentIndex() + 1); 1748 QString arg_ptr = QString("args[%1]").arg(argument->argumentIndex() + 1);
1746 1749
1747 if (type->isContainer()) { 1750 if (type->isContainer()) {
1748 s << INDENT << translateType(type, signal->implementingClass(), BoxedPrimitive) << " " << arg_name << ";" << endl 1751 s << INDENT << translateType(type, signal->implementingClass(), BoxedPrimitive) << " " << arg_name << ";" << endl
1749 << INDENT << fromCppContainerName(d_class, type) << "(" << arg_ptr << ", &" << arg_name << ");" << endl; 1752 << INDENT << cppContainerConversionName(d_class, type, FromCpp) << "(" << arg_ptr << ", &" << arg_name << ");" << endl;
1750 } else if (type->isTargetLangString()) { 1753 } else if (type->isTargetLangString()) {
1751 s << INDENT << "auto " << arg_name << "_ptr = " << arg_ptr << ";" << endl 1754 s << INDENT << "auto " << arg_name << "_ptr = " << arg_ptr << ";" << endl
1752 << INDENT << "string " << arg_name << " = QString.toNativeString(" << arg_name << "_ptr);"; 1755 << INDENT << "string " << arg_name << " = QString.toNativeString(" << arg_name << "_ptr);";
1753 } else if(type->isPrimitive() || type->isEnum() || type->isFlags() || type->typeEntry()->isStructInD()) { 1756 } else if(type->isPrimitive() || type->isEnum() || type->isFlags() || type->typeEntry()->isStructInD()) {
1754 QString type_name = argument->type()->typeEntry()->qualifiedTargetLangName(); 1757 QString type_name = argument->type()->typeEntry()->qualifiedTargetLangName();
2150 { 2153 {
2151 AbstractMetaFunctionList signal_funcs = signalFunctions(d_class, false); 2154 AbstractMetaFunctionList signal_funcs = signalFunctions(d_class, false);
2152 writeSignalSignatures(s, d_class, signal_funcs); 2155 writeSignalSignatures(s, d_class, signal_funcs);
2153 2156
2154 foreach (AbstractMetaFunction *signal, signal_funcs) 2157 foreach (AbstractMetaFunction *signal, signal_funcs)
2158 {
2155 writeSignal(s, signal); 2159 writeSignal(s, signal);
2160 if(!signal->isPrivate())
2161 writeFunction(s, signal);
2162 }
2156 } 2163 }
2157 2164
2158 // Class has subclasses but also only private constructors 2165 // Class has subclasses but also only private constructors
2159 if (!d_class->isFinalInTargetLang() && d_class->isFinalInCpp()) { 2166 if (!d_class->isFinalInTargetLang() && d_class->isFinalInCpp()) {
2160 s << endl << INDENT << "/**" << endl 2167 s << endl << INDENT << "/**" << endl
2501 2508
2502 if (d_class->hasConstructors() && !d_class->isQObject()) 2509 if (d_class->hasConstructors() && !d_class->isQObject())
2503 s << "extern (C) void qtd_" << d_class->name() << "_destructor(void *ptr);" << endl << endl; 2510 s << "extern (C) void qtd_" << d_class->name() << "_destructor(void *ptr);" << endl << endl;
2504 2511
2505 // qtd 2512 // qtd
2513
2514 s << endl << "// C wrappers for signal emitters" << endl;
2515
2516 if (d_class->isQObject())
2517 {
2518 AbstractMetaFunctionList signal_funcs = signalFunctions(d_class, false);
2519
2520 foreach (AbstractMetaFunction *signal, signal_funcs)
2521 if(!signal->isPrivate())
2522 writePrivateNativeFunction(s, signal);
2523 }
2524
2506 s << endl << "// C wrappers" << endl; 2525 s << endl << "// C wrappers" << endl;
2507 d_funcs = d_class->functionsInTargetLang(); 2526 d_funcs = d_class->functionsInTargetLang();
2508 if (!d_class->isInterface()) 2527 if (!d_class->isInterface())
2509 for (int i=0; i<d_funcs.size(); ++i) { 2528 for (int i=0; i<d_funcs.size(); ++i) {
2510 AbstractMetaFunction *function = d_funcs.at(i); 2529 AbstractMetaFunction *function = d_funcs.at(i);
2800 2819
2801 s << INDENT << "mixin Signal!(\"" << d_function->name() << "\""; 2820 s << INDENT << "mixin Signal!(\"" << d_function->name() << "\"";
2802 2821
2803 if (sz > 0) { 2822 if (sz > 0) {
2804 for (int i=0; i<sz; ++i) { 2823 for (int i=0; i<sz; ++i) {
2805 s << ", "; 2824 s << ", ";
2806 2825
2807 QString modifiedType = d_function->typeReplaced(i+1); 2826 QString modifiedType = d_function->typeReplaced(i+1);
2808 2827
2809 if (modifiedType.isEmpty()) 2828 if (modifiedType.isEmpty())
2810 s << translateType(arguments.at(i)->type(), d_function->implementingClass(), BoxedPrimitive); 2829 s << translateType(arguments.at(i)->type(), d_function->implementingClass(), BoxedPrimitive);