Files
UnrealEngineUWP/Engine/Source/Developer/BlueprintCompilerCppBackend/Private/BlueprintCompilerCppBackendBase.h
ryan durand 471d972e62 Updating copyright for Engine Developer.
#rnx
#rb none


#ROBOMERGE-SOURCE: CL 10869240 via CL 10869516 via CL 10869902
#ROBOMERGE-BOT: (v613-10869866)

[CL 10870584 by ryan durand in Main branch]
2019-12-26 15:32:37 -05:00

99 lines
4.1 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "KismetCompiledFunctionContext.h"
#include "BlueprintCompilerCppBackendInterface.h"
#include "Engine/Blueprint.h" // for FCompilerNativizationOptions
class UUserDefinedEnum;
class UUserDefinedStruct;
struct FEmitterLocalContext;
/** The class generates all native code except of function body (notice InnerFunctionImplementation in not implemented) */
class FBlueprintCompilerCppBackendBase : public IBlueprintCompilerCppBackend
{
protected:
struct FFunctionLabelInfo
{
TMap<FBlueprintCompiledStatement*, int32> StateMap;
int32 StateCounter;
FFunctionLabelInfo()
{
StateCounter = 0;
}
int32 StatementToStateIndex(FBlueprintCompiledStatement* Statement)
{
int32& Index = StateMap.FindOrAdd(Statement);
if (Index == 0)
{
Index = ++StateCounter;
}
return Index;
}
};
TArray<FFunctionLabelInfo> StateMapPerFunction;
TMap<FKismetFunctionContext*, int32> FunctionIndexMap;
FKismetFunctionContext* UberGraphContext;
TMap<FBlueprintCompiledStatement*, int32> UberGraphStatementToExecutionGroup;
public:
// IBlueprintCompilerCppBackend implementation
virtual FString GenerateCodeFromClass(UClass* SourceClass, TIndirectArray<FKismetFunctionContext>& Functions, bool bGenerateStubsOnly, const FCompilerNativizationOptions& NativizationOptions, FString& OutCppBody) override;
virtual void GenerateCodeFromEnum(UUserDefinedEnum* SourceEnum, const FCompilerNativizationOptions& NativizationOptions, FString& OutHeaderCode, FString& OutCPPCode) override;
virtual void GenerateCodeFromStruct(UUserDefinedStruct* SourceStruct, const FCompilerNativizationOptions& NativizationOptions, FString& OutHeaderCode, FString& OutCPPCode) override;
virtual FString GenerateWrapperForClass(UClass* SourceClass, const FCompilerNativizationOptions& NativizationOptions) override;
// end of IBlueprintCompilerCppBackend implementation
virtual ~FBlueprintCompilerCppBackendBase() {}
protected:
/*
ConstructFunction generates definition, declaration and local variables. The actual implementation is generated by InnerFunctionImplementation.
For example - this code is generated by ConstructFunction:
void AMyActor_Child_C::BoxBox_Implementation(FBox2D NewParam, FBox2D& NewParam1)
{
FBox2D CallFunc_BoxBox_NewParam1{};
// this part is generated by InnerFunctionImplementation
return;
}
Returns true is the generated function is not reducible.
*/
virtual bool InnerFunctionImplementation(FKismetFunctionContext& FunctionContext, FEmitterLocalContext& EmitterContext, int32 ExecutionGroup) = 0;
int32 StatementToStateIndex(FKismetFunctionContext& FunctionContext, FBlueprintCompiledStatement* Statement)
{
int32 Index = FunctionIndexMap.FindChecked(&FunctionContext);
return StateMapPerFunction[Index].StatementToStateIndex(Statement);
}
private:
/** Builds both the header declaration and body implementation of a function */
void ConstructFunction(FKismetFunctionContext& FunctionContext, FEmitterLocalContext& EmitterContext, bool bGenerateStubOnly);
static TArray<FString> ConstructFunctionDeclaration(FEmitterLocalContext &EmitterContext, FKismetFunctionContext &FunctionContext, TArray<FProperty*> &ArgumentList);
static FString GenerateArgList(const FEmitterLocalContext &EmitterContext, const TArray<FProperty*> &ArgumentList, bool bOnlyParamName = false);
static FString GenerateReturnType(const FEmitterLocalContext &EmitterContext, const UFunction* Function);
void ConstructFunctionBody(FEmitterLocalContext& EmitterContext, FKismetFunctionContext &FunctionContext, int32 ExecutionGroup);
void CleanBackend();
static void EmitFileBeginning(const FString& CleanName, FEmitterLocalContext& EmitterContext, bool bIncludeGeneratedH = true, bool bIncludeCodeHelpersInHeader = false, bool bFullyIncludedDeclaration = false, UField* AdditionalFieldToIncludeInHeader = nullptr);
static void EmitStructProperties(FEmitterLocalContext& EmitterContext, UStruct* SourceClass);
static void DeclareDelegates(FEmitterLocalContext& EmitterContext, TIndirectArray<FKismetFunctionContext>& Functions);
};