FString FScriptCodeGeneratorBase::GenerateFunctionDispatch(UFunction* Function) { FString Params; const bool bHasParamsOrReturnValue = (Function->Children != NULL); if (bHasParamsOrReturnValue) { Params += TEXT("\tstruct FDispatchParams\r\n\t{\r\n"); for (TFieldIterator<UProperty> ParamIt(Function); ParamIt; ++ParamIt) { UProperty* Param = *ParamIt; Params += FString::Printf(TEXT("\t\t%s %s;\r\n"), *GetPropertyTypeCPP(Param, CPPF_ArgumentOrReturnValue), *Param->GetName()); } Params += TEXT("\t} Params;\r\n"); int32 ParamIndex = 0; for (TFieldIterator<UProperty> ParamIt(Function); ParamIt; ++ParamIt, ++ParamIndex) { UProperty* Param = *ParamIt; Params += FString::Printf(TEXT("\tParams.%s = %s;\r\n"), *Param->GetName(), *InitializeFunctionDispatchParam(Function, Param, ParamIndex)); } } Params += FString::Printf(TEXT("\tstatic UFunction* Function = Obj->FindFunctionChecked(TEXT(\"%s\"));\r\n"), *Function->GetName()); if (bHasParamsOrReturnValue) { Params += TEXT("\tcheck(Function->ParmsSize == sizeof(FDispatchParams));\r\n"); Params += TEXT("\tObj->ProcessEvent(Function, &Params);\r\n"); } else { Params += TEXT("\tObj->ProcessEvent(Function, NULL);\r\n"); } return Params; }
FString FLuaScriptCodeGenerator::ExportProperty(const FString& ClassNameCPP, UClass* Class, UProperty* Property, int32 PropertyIndex) { FString PropertyName = Property->GetName(); UProperty* ReturnValue = NULL; UClass* PropertySuper = NULL; if (Property->GetOwnerClass() != Class) { // Find the base class where this property was defined if (ExportedClasses.Contains(Property->GetOwnerClass()->GetFName())) { PropertySuper = Property->GetOwnerClass(); } } // Getter FString GetterName = FString::Printf(TEXT("Get_%s"), *PropertyName); FString GeneratedGlue = GenerateWrapperFunctionDeclaration(ClassNameCPP, Class, GetterName); GeneratedGlue += TEXT("\r\n{\r\n"); FString FunctionBody; if (PropertySuper == NULL) { FunctionBody += FString::Printf(TEXT("\t%s\r\n"), *GenerateObjectDeclarationFromContext(ClassNameCPP, Class)); FunctionBody += FString::Printf(TEXT("\tstatic UProperty* Property = FindScriptPropertyHelper(%s::StaticClass(), TEXT(\"%s\"));\r\n"), *ClassNameCPP, *Property->GetName()); FunctionBody += FString::Printf(TEXT("\t%s PropertyValue;\r\n"), *GetPropertyTypeCPP(Property, CPPF_ArgumentOrReturnValue)); FunctionBody += TEXT("\tProperty->CopyCompleteValue(&PropertyValue, Property->ContainerPtrToValuePtr<void>(Obj));\r\n"); FunctionBody += FString::Printf(TEXT("\t%s\r\n"), *GenerateReturnValueHandler(ClassNameCPP, Class, NULL, Property, TEXT("PropertyValue"))); } else { FunctionBody = FString::Printf(TEXT("\treturn %s_%s(InScriptContext);\r\n"), *PropertySuper->GetName(), *GetterName); } GeneratedGlue += FunctionBody; GeneratedGlue += TEXT("}\r\n\r\n"); FunctionBody.Empty(FunctionBody.Len()); // Store the name of this getter as well as the name of the wrapper function FPropertyAccessor Getter; Getter.AccessorName = GetterName; Getter.FunctionName = FString::Printf(TEXT("%s_%s"), *Class->GetName(), *GetterName); auto& Exports = ClassExportedProperties.FindOrAdd(Class); Exports.Add(Getter); // Setter FString SetterName = FString::Printf(TEXT("Set_%s"), *PropertyName); GeneratedGlue += GenerateWrapperFunctionDeclaration(ClassNameCPP, Class, SetterName); GeneratedGlue += TEXT("\r\n{\r\n"); if (PropertySuper == NULL) { FunctionBody += FString::Printf(TEXT("\t%s\r\n"), *GenerateObjectDeclarationFromContext(ClassNameCPP, Class)); FunctionBody += FString::Printf(TEXT("\tstatic UProperty* Property = FindScriptPropertyHelper(%s::StaticClass(), TEXT(\"%s\"));\r\n"), *ClassNameCPP, *Property->GetName()); FunctionBody += FString::Printf(TEXT("\t%s PropertyValue = %s;\r\n"), *GetPropertyTypeCPP(Property, CPPF_ArgumentOrReturnValue), *InitializeFunctionDispatchParam(NULL, Property, 0)); FunctionBody += TEXT("\tProperty->CopyCompleteValue(Property->ContainerPtrToValuePtr<void>(Obj), &PropertyValue);\r\n"); FunctionBody += TEXT("\treturn 0;\r\n"); } else { FunctionBody = FString::Printf(TEXT("\treturn %s_%s(InScriptContext);\r\n"), *PropertySuper->GetName(), *SetterName); } GeneratedGlue += FunctionBody; GeneratedGlue += TEXT("}\r\n\r\n"); // Store the name of this setter as well as the name of the wrapper function FPropertyAccessor Setter; Setter.AccessorName = SetterName; Setter.FunctionName = FString::Printf(TEXT("%s_%s"), *Class->GetName(), *SetterName); Exports.Add(Setter); return GeneratedGlue; }