474 lines
26 KiB
C++
474 lines
26 KiB
C++
|
|
// Tencent is pleased to support the open source community by making UnLua available.
|
||
|
|
//
|
||
|
|
// Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
|
||
|
|
//
|
||
|
|
// Licensed under the MIT License (the "License");
|
||
|
|
// you may not use this file except in compliance with the License. You may obtain a copy of the License at
|
||
|
|
//
|
||
|
|
// http://opensource.org/licenses/MIT
|
||
|
|
//
|
||
|
|
// Unless required by applicable law or agreed to in writing,
|
||
|
|
// software distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
|
// See the License for the specific language governing permissions and limitations under the License.
|
||
|
|
|
||
|
|
#include "CoreUObject.h"
|
||
|
|
#include "Features/IModularFeatures.h"
|
||
|
|
#include "IScriptGeneratorPluginInterface.h"
|
||
|
|
#include "UnLuaCompatibility.h"
|
||
|
|
|
||
|
|
#define LOCTEXT_NAMESPACE "FUnLuaDefaultParamCollectorModule"
|
||
|
|
|
||
|
|
static bool FindDefaultValueString(const TMap<FName, FString>* MetaMap, const FProperty* Param, FString& OutString)
|
||
|
|
{
|
||
|
|
check(MetaMap && Param);
|
||
|
|
|
||
|
|
const FName ParamName(*Param->GetName());
|
||
|
|
const FString* DefaultValue = MetaMap->Find(ParamName);
|
||
|
|
if (DefaultValue)
|
||
|
|
{
|
||
|
|
// Specified default value in the UFUNCTION metadata
|
||
|
|
OutString = *DefaultValue;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
const FName CppKey(*(FString(TEXT("CPP_Default_")) + Param->GetName()));
|
||
|
|
const FString* CppDefaultValue = MetaMap->Find(CppKey);
|
||
|
|
if (CppDefaultValue)
|
||
|
|
{
|
||
|
|
// Default value in the function signature
|
||
|
|
OutString = *CppDefaultValue;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
class FUnLuaDefaultParamCollectorModule : public IScriptGeneratorPluginInterface
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
virtual void StartupModule() override
|
||
|
|
{
|
||
|
|
IModularFeatures::Get().RegisterModularFeature(TEXT("ScriptGenerator"), this);
|
||
|
|
HasGameRuntime = false;
|
||
|
|
}
|
||
|
|
|
||
|
|
virtual void ShutdownModule() override
|
||
|
|
{
|
||
|
|
IModularFeatures::Get().UnregisterModularFeature(TEXT("ScriptGenerator"), this);
|
||
|
|
}
|
||
|
|
|
||
|
|
virtual FString GetGeneratedCodeModuleName() const override { return TEXT("UnLua"); }
|
||
|
|
|
||
|
|
virtual bool SupportsTarget(const FString& TargetName) const override { return true; }
|
||
|
|
|
||
|
|
virtual bool ShouldExportClassesForModule(const FString& ModuleName, EBuildModuleType::Type ModuleType, const FString& ModuleGeneratedIncludeDirectory) const override
|
||
|
|
{
|
||
|
|
FUnLuaDefaultParamCollectorModule* NonConstPtr = const_cast<FUnLuaDefaultParamCollectorModule*>(this);
|
||
|
|
NonConstPtr->ParseModule(ModuleName, ModuleType, ModuleGeneratedIncludeDirectory);
|
||
|
|
return ModuleType == EBuildModuleType::EngineRuntime || ModuleType == EBuildModuleType::GameRuntime; // only 'EngineRuntime' and 'GameRuntime' are valid
|
||
|
|
}
|
||
|
|
|
||
|
|
virtual void Initialize(const FString& RootLocalPath, const FString& RootBuildPath, const FString& OutputDirectory, const FString& IncludeBase) override
|
||
|
|
{
|
||
|
|
GeneratedFileContent.Empty();
|
||
|
|
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FFunctionCollection* FC = nullptr;\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FParameterCollection* PC = nullptr;\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FBoolParamValue* SharedBool_TRUE = new FBoolParamValue(true);\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FBoolParamValue* SharedBool_FALSE = new FBoolParamValue(false);\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FFloatParamValue* SharedFloat_Zero = new FFloatParamValue(0.000000f);\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FFloatParamValue* SharedFloat_One = new FFloatParamValue(1.000000f);\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FEnumParamValue* SharedEnum_Zero = new FEnumParamValue(0);\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FIntParamValue* SharedInt_Zero = new FIntParamValue(0);\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FByteParamValue* SharedByte_Zero = new FByteParamValue(0);\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FNameParamValue* SharedFName_None = new FNameParamValue(FName(\"None\"));\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FVectorParamValue* SharedFVector_Zero = new FVectorParamValue(FVector(EForceInit::ForceInitToZero));\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FVector2DParamValue* SharedFVector2D_Zero = new FVector2DParamValue(FVector2D(EForceInit::ForceInitToZero));\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FRotatorParamValue* SharedFRotator_Zero = new FRotatorParamValue(FRotator(EForceInit::ForceInitToZero));\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FLinearColorParamValue* SharedFLinearColor_Zero = new FLinearColorParamValue(FLinearColor(EForceInit::ForceInitToZero));\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FColorParamValue* SharedFColor_Zero = new FColorParamValue(FColor(EForceInit::ForceInitToZero));\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FScriptArrayParamValue* SharedScriptArray = new FScriptArrayParamValue();\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FScriptDelegateParamValue* SharedScriptDelegate = new FScriptDelegateParamValue(FScriptDelegate());\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FMulticastScriptDelegateParamValue* SharedMulticastScriptDelegate = new FMulticastScriptDelegateParamValue(FMulticastScriptDelegate());\r\n"));
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("\r\n"));
|
||
|
|
|
||
|
|
OutputDir = OutputDirectory;
|
||
|
|
}
|
||
|
|
|
||
|
|
virtual void ExportClass(UClass* Class, const FString& SourceHeaderFilename, const FString& GeneratedHeaderFilename, bool bHasChanged) override
|
||
|
|
{
|
||
|
|
// #lizard forgives
|
||
|
|
|
||
|
|
// filter out interfaces
|
||
|
|
if (Class->HasAnyClassFlags(CLASS_Interface))
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
for (TFieldIterator<UFunction> FuncIt(Class, EFieldIteratorFlags::ExcludeSuper, EFieldIteratorFlags::ExcludeDeprecated); FuncIt; ++FuncIt)
|
||
|
|
{
|
||
|
|
UFunction* Function = *FuncIt;
|
||
|
|
CurrentFunctionName.Empty();
|
||
|
|
|
||
|
|
// filter out functions without meta data
|
||
|
|
TMap<FName, FString>* MetaMap = UMetaData::GetMapForObject(Function);
|
||
|
|
if (!MetaMap)
|
||
|
|
{
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
|
||
|
|
const FString& AutoCreateRefTerm = MetaMap->FindRef("AutoCreateRefTerm");
|
||
|
|
TArray<FString> AutoEmitParameterNames;
|
||
|
|
if (!AutoCreateRefTerm.IsEmpty())
|
||
|
|
{
|
||
|
|
AutoCreateRefTerm.ParseIntoArray(AutoEmitParameterNames, TEXT(","), true);
|
||
|
|
for (FString& ParamName : AutoEmitParameterNames)
|
||
|
|
ParamName.TrimStartAndEndInline();
|
||
|
|
// GeneratedFileContent += FString::Printf(TEXT("// DEBUG %s AutoCreateRefTerm=%s \r\n"), *Function->GetName(), *AutoCreateRefTerm);
|
||
|
|
}
|
||
|
|
|
||
|
|
// parameters
|
||
|
|
for (TFieldIterator<FProperty> It(Function); It && (It->HasAnyPropertyFlags(CPF_Parm) && !It->HasAnyPropertyFlags(CPF_ReturnParm)); ++It)
|
||
|
|
{
|
||
|
|
FProperty* Property = *It;
|
||
|
|
FString ValueStr;
|
||
|
|
|
||
|
|
// filter out properties without default value
|
||
|
|
if (!FindDefaultValueString(MetaMap, Property, ValueStr))
|
||
|
|
{
|
||
|
|
if (AutoEmitParameterNames.Find(Property->GetName()) == INDEX_NONE)
|
||
|
|
{
|
||
|
|
// GeneratedFileContent += FString::Printf(TEXT("// DEBUG %s has no default value\r\n"), *Property->GetName());
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
// GeneratedFileContent += FString::Printf(TEXT("// DEBUG %s AutoEmitParameterNames(%d) %s\r\n"),
|
||
|
|
// *Property->GetName(), AutoEmitParameterNames.Find(Property->GetName()), *AutoCreateRefTerm);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (Property->IsA(FStructProperty::StaticClass()))
|
||
|
|
{
|
||
|
|
// get all possible script structs
|
||
|
|
UPackage* CoreUObjectPackage = UObject::StaticClass()->GetOutermost();
|
||
|
|
static const UScriptStruct* VectorStruct = FindObjectChecked<UScriptStruct>(CoreUObjectPackage, TEXT("Vector"));
|
||
|
|
static const UScriptStruct* Vector2DStruct = FindObjectChecked<UScriptStruct>(CoreUObjectPackage, TEXT("Vector2D"));
|
||
|
|
static const UScriptStruct* RotatorStruct = FindObjectChecked<UScriptStruct>(CoreUObjectPackage, TEXT("Rotator"));
|
||
|
|
static const UScriptStruct* LinearColorStruct = FindObjectChecked<UScriptStruct>(CoreUObjectPackage, TEXT("LinearColor"));
|
||
|
|
static const UScriptStruct* ColorStruct = FindObjectChecked<UScriptStruct>(CoreUObjectPackage, TEXT("Color"));
|
||
|
|
|
||
|
|
const FStructProperty* StructProperty = CastField<FStructProperty>(Property);
|
||
|
|
if (StructProperty->Struct == VectorStruct) // FVector
|
||
|
|
{
|
||
|
|
if(ValueStr.IsEmpty())
|
||
|
|
{
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedFVector_Zero);\r\n"), *Property->GetName());
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
TArray<FString> Values;
|
||
|
|
ValueStr.ParseIntoArray(Values, TEXT(","));
|
||
|
|
if (Values.Num() == 3)
|
||
|
|
{
|
||
|
|
float X = TCString<TCHAR>::Atof(*Values[0]);
|
||
|
|
float Y = TCString<TCHAR>::Atof(*Values[1]);
|
||
|
|
float Z = TCString<TCHAR>::Atof(*Values[2]);
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FVectorParamValue(FVector(%ff,%ff,%ff)));\r\n"), *Property->GetName(), X, Y, Z);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else if (StructProperty->Struct == RotatorStruct) // FRotator
|
||
|
|
{
|
||
|
|
if(ValueStr.IsEmpty())
|
||
|
|
{
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedFRotator_Zero);\r\n"), *Property->GetName());
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
TArray<FString> Values;
|
||
|
|
ValueStr.ParseIntoArray(Values, TEXT(","));
|
||
|
|
if (Values.Num() == 3)
|
||
|
|
{
|
||
|
|
float Pitch = TCString<TCHAR>::Atof(*Values[0]);
|
||
|
|
float Yaw = TCString<TCHAR>::Atof(*Values[1]);
|
||
|
|
float Roll = TCString<TCHAR>::Atof(*Values[2]);
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FRotatorParamValue(FRotator(%ff,%ff,%ff)));\r\n"),
|
||
|
|
*Property->GetName(), Pitch, Yaw, Roll);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else if (StructProperty->Struct == Vector2DStruct) // FVector2D
|
||
|
|
{
|
||
|
|
if(ValueStr.IsEmpty())
|
||
|
|
{
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedFVector2D_Zero);\r\n"), *Property->GetName());
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
FVector2D Value;
|
||
|
|
Value.InitFromString(ValueStr);
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FVector2DParamValue(FVector2D(%ff,%ff)));\r\n"), *Property->GetName(), Value.X, Value.Y);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else if (StructProperty->Struct == LinearColorStruct) // FLinearColor
|
||
|
|
{
|
||
|
|
if(ValueStr.IsEmpty())
|
||
|
|
{
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedFLinearColor_Zero);\r\n"), *Property->GetName());
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
FLinearColor Value;
|
||
|
|
Value.InitFromString(ValueStr);
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FLinearColorParamValue(FLinearColor(%ff,%ff,%ff,%ff)));\r\n"),
|
||
|
|
*Property->GetName(), Value.R, Value.G, Value.B, Value.A);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else if (StructProperty->Struct == ColorStruct) // FColor
|
||
|
|
{
|
||
|
|
if(ValueStr.IsEmpty())
|
||
|
|
{
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedFColor_Zero);\r\n"), *Property->GetName());
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
FColor Value;
|
||
|
|
Value.InitFromString(ValueStr);
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FColorParamValue(FColor(%d,%d,%d,%d)));\r\n"),
|
||
|
|
*Property->GetName(), Value.R, Value.G, Value.B, Value.A);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
if (Property->IsA(FIntProperty::StaticClass())) // int
|
||
|
|
{
|
||
|
|
int32 Value = TCString<TCHAR>::Atoi(*ValueStr);
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
if (Value == 0)
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedInt_Zero);\r\n"), *Property->GetName(), Value);
|
||
|
|
else
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FIntParamValue(%d));\r\n"), *Property->GetName(), Value);
|
||
|
|
}
|
||
|
|
else if (Property->IsA(FByteProperty::StaticClass())) // byte
|
||
|
|
{
|
||
|
|
const UEnum* Enum = CastField<FByteProperty>(Property)->Enum;
|
||
|
|
if(Enum)
|
||
|
|
{
|
||
|
|
int64 Value = Enum->GetValueByNameString(ValueStr);
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
if (Value == 0)
|
||
|
|
{
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedByte_Zero);\r\n"), *Property->GetName(), Value);
|
||
|
|
}
|
||
|
|
else if (Value > 0 && Value <= 255)
|
||
|
|
{
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FByteParamValue(%d));\r\n"), *Property->GetName(), Value);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FRuntimeEnumParamValue(\"%s\",%d));\r\n"), *Property->GetName(), *Enum->CppType, Enum->GetIndexByNameString(ValueStr));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
int32 Value = TCString<TCHAR>::Atoi(*ValueStr);
|
||
|
|
check(Value >= 0 && Value <= 255)
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
if (Value == 0)
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedByte_Zero);\r\n"), *Property->GetName(), Value);
|
||
|
|
else
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FByteParamValue(%d));\r\n"), *Property->GetName(), Value);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else if (Property->IsA(FEnumProperty::StaticClass())) // enum
|
||
|
|
{
|
||
|
|
const UEnum* Enum = CastField<FEnumProperty>(Property)->GetEnum();
|
||
|
|
if(Enum)
|
||
|
|
{
|
||
|
|
int64 Value = Enum->GetValueByNameString(ValueStr);
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
if (Value == 0)
|
||
|
|
{
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedEnum_Zero);\r\n"), *Property->GetName(), Value);
|
||
|
|
}
|
||
|
|
else if (Value > 0 && Value <= 255)
|
||
|
|
{
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FEnumParamValue(%ld));\r\n"), *Property->GetName(), Value);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FRuntimeEnumParamValue(\"%s\",%d));\r\n"), *Property->GetName(), *Enum->CppType, Enum->GetIndexByNameString(ValueStr));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
int64 Value = TCString<TCHAR>::Atoi64(*ValueStr);
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
if (Value == 0)
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedEnum_Zero);\r\n"), *Property->GetName(), Value);
|
||
|
|
else
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FEnumParamValue(%ld));\r\n"), *Property->GetName(), Value);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else if (Property->IsA(FFloatProperty::StaticClass())) // float
|
||
|
|
{
|
||
|
|
float Value = TCString<TCHAR>::Atof(*ValueStr);
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
if (FMath::IsNearlyZero(Value))
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedFloat_Zero);\r\n"), *Property->GetName(), Value);
|
||
|
|
else if (FMath::IsNearlyEqual(Value, 1))
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedFloat_One);\r\n"), *Property->GetName(), Value);
|
||
|
|
else
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FFloatParamValue(%ff));\r\n"), *Property->GetName(), Value);
|
||
|
|
}
|
||
|
|
else if (Property->IsA(FDoubleProperty::StaticClass())) // double
|
||
|
|
{
|
||
|
|
double Value = TCString<TCHAR>::Atod(*ValueStr);
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FDoubleParamValue(%lf));\r\n"), *Property->GetName(), Value);
|
||
|
|
}
|
||
|
|
else if (Property->IsA(FBoolProperty::StaticClass())) // boolean
|
||
|
|
{
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
if (ValueStr.IsEmpty())
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedBool_FALSE);\r\n"), *Property->GetName());
|
||
|
|
else
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedBool_%s);\r\n"), *Property->GetName(), *ValueStr.ToUpper());
|
||
|
|
}
|
||
|
|
else if (Property->IsA(FNameProperty::StaticClass())) // FName
|
||
|
|
{
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
if (ValueStr == "None")
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedFName_None);\r\n"), *Property->GetName(), *ValueStr);
|
||
|
|
else
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FNameParamValue(FName(\"%s\")));\r\n"), *Property->GetName(), *ValueStr);
|
||
|
|
}
|
||
|
|
else if (Property->IsA(FTextProperty::StaticClass())) // FText
|
||
|
|
{
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
#if ENGINE_MAJOR_VERSION > 4 || (ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION > 20)
|
||
|
|
if (ValueStr.StartsWith(TEXT("INVTEXT(\"")))
|
||
|
|
{
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FTextParamValue(%s));\r\n"), *Property->GetName(), *ValueStr);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
#endif
|
||
|
|
{
|
||
|
|
GeneratedFileContent += FString::Printf(
|
||
|
|
TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FTextParamValue(FText::FromString(TEXT(\"%s\"))));\r\n"), *Property->GetName(), *ValueStr);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else if (Property->IsA(FStrProperty::StaticClass())) // FString
|
||
|
|
{
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), new FStringParamValue(TEXT(\"%s\")));\r\n"), *Property->GetName(), *ValueStr);
|
||
|
|
}
|
||
|
|
else if (Property->IsA(FArrayProperty::StaticClass()))
|
||
|
|
{
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedScriptArray);\r\n"), *Property->GetName());
|
||
|
|
}
|
||
|
|
else if (Property->IsA(FDelegateProperty::StaticClass()))
|
||
|
|
{
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedScriptDelegate);\r\n"), *Property->GetName());
|
||
|
|
}
|
||
|
|
else if (Property->IsA(FMulticastDelegateProperty::StaticClass()))
|
||
|
|
{
|
||
|
|
PreAddProperty(Class, Function);
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC->Parameters.Add(TEXT(\"%s\"), SharedMulticastDelegate);\r\n"), *Property->GetName());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (CurrentClassName.Len() > 0)
|
||
|
|
{
|
||
|
|
CurrentClassName.Empty();
|
||
|
|
CurrentFunctionName.Empty();
|
||
|
|
|
||
|
|
GeneratedFileContent += TEXT("\r\n");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
virtual void FinishExport() override
|
||
|
|
{
|
||
|
|
const FString FilePath = FString::Printf(TEXT("%s%s"), *OutputDir, TEXT("DefaultParamCollection.inl"));
|
||
|
|
FString FileContent;
|
||
|
|
FFileHelper::LoadFileToString(FileContent, *FilePath);
|
||
|
|
|
||
|
|
// If Current build Game Project, try to update DefaultParamCollection.inl file for project
|
||
|
|
if (HasGameRuntime)
|
||
|
|
{
|
||
|
|
if (GeneratedFileContent != FileContent)
|
||
|
|
{
|
||
|
|
bool bResult = FFileHelper::SaveStringToFile(GeneratedFileContent, *FilePath, FFileHelper::EEncodingOptions::ForceUTF8WithoutBOM);
|
||
|
|
check(bResult);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
// If Current build Engine Project, try create new file if has no DefaultParamCollection.inl to fix compile error
|
||
|
|
// or do not update DefaultParamCollection.inl file if exists
|
||
|
|
if (!FPaths::FileExists(FilePath) || FileContent.Len() == 0)
|
||
|
|
{
|
||
|
|
bool bResult = FFileHelper::SaveStringToFile(GeneratedFileContent, *FilePath, FFileHelper::EEncodingOptions::ForceUTF8WithoutBOM);
|
||
|
|
check(bResult);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
virtual FString GetGeneratorName() const override
|
||
|
|
{
|
||
|
|
return TEXT("UnLua Default Parameters Collector");
|
||
|
|
}
|
||
|
|
|
||
|
|
private:
|
||
|
|
void PreAddProperty(UClass* Class, UFunction* Function)
|
||
|
|
{
|
||
|
|
if (CurrentClassName.Len() < 1)
|
||
|
|
{
|
||
|
|
CurrentClassName = FString::Printf(TEXT("%s%s"), Class->GetPrefixCPP(), *Class->GetName());
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("FC = &GDefaultParamCollection.Add(TEXT(\"%s\"));\r\n"), *CurrentClassName);
|
||
|
|
}
|
||
|
|
if (CurrentFunctionName.Len() < 1)
|
||
|
|
{
|
||
|
|
CurrentFunctionName = Function->GetName();
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("PC = &FC->Functions.Add(TEXT(\"%s\"));\r\n"), *CurrentFunctionName);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void ParseModule(const FString& ModuleName, EBuildModuleType::Type ModuleType, const FString& ModuleGeneratedIncludeDirectory)
|
||
|
|
{
|
||
|
|
GeneratedFileContent += FString::Printf(TEXT("// ModuleName %s Type %d ModuleGeneratedIncludeDirectory %s \r\n"), *ModuleName, ModuleType, *ModuleGeneratedIncludeDirectory);
|
||
|
|
if (ModuleType == EBuildModuleType::GameRuntime)
|
||
|
|
{
|
||
|
|
// For Only Game Project has GameRuntime Module, this should be Game Project
|
||
|
|
HasGameRuntime = true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
bool HasGameRuntime; // Flag for if current uht has GameRuntime module or not
|
||
|
|
FString OutputDir;
|
||
|
|
FString CurrentClassName;
|
||
|
|
FString CurrentFunctionName;
|
||
|
|
FString GeneratedFileContent;
|
||
|
|
};
|
||
|
|
|
||
|
|
#undef LOCTEXT_NAMESPACE
|
||
|
|
|
||
|
|
IMPLEMENT_MODULE(FUnLuaDefaultParamCollectorModule, UnLuaDefaultParamCollector)
|