From ee2653657e32b7a61710a18ecb50235130009d0a Mon Sep 17 00:00:00 2001 From: Jan Date: Fri, 15 Nov 2019 14:55:35 +0100 Subject: [PATCH] ZoneCodeGenerator: Add template code and separate into different template files for a better overview and less cluttered template code --- .../Generating/TemplateGroupResources.cs | 2 +- .../Templates/Loading/ArrayPointer.stg | 30 ++++++++++++++ .../Generating/Templates/Loading/Common.stg | 2 + .../Templates/Loading/SinglePointer.stg | 41 +++++++++++++++++++ .../Generating/Templates/Loading/String.stg | 26 ++++++++++++ .../Generating/Templates/ZoneLoad.stg | 27 ++++-------- 6 files changed, 109 insertions(+), 19 deletions(-) create mode 100644 src/ZoneCodeGenerator/Generating/Templates/Loading/ArrayPointer.stg create mode 100644 src/ZoneCodeGenerator/Generating/Templates/Loading/Common.stg create mode 100644 src/ZoneCodeGenerator/Generating/Templates/Loading/SinglePointer.stg create mode 100644 src/ZoneCodeGenerator/Generating/Templates/Loading/String.stg diff --git a/src/ZoneCodeGenerator/Generating/TemplateGroupResources.cs b/src/ZoneCodeGenerator/Generating/TemplateGroupResources.cs index dd640c87..035abfb3 100644 --- a/src/ZoneCodeGenerator/Generating/TemplateGroupResources.cs +++ b/src/ZoneCodeGenerator/Generating/TemplateGroupResources.cs @@ -113,7 +113,7 @@ namespace ZoneCodeGenerator.Generating private static Stream StreamFromResources(string fileName) { - var resourceName = $"{ResourceBasePath}.{fileName}"; + var resourceName = $"{ResourceBasePath}.{fileName.Replace('\\', '.').Replace('/', '.')}"; var assembly = Assembly.GetExecutingAssembly(); return assembly.GetManifestResourceStream(resourceName); diff --git a/src/ZoneCodeGenerator/Generating/Templates/Loading/ArrayPointer.stg b/src/ZoneCodeGenerator/Generating/Templates/Loading/ArrayPointer.stg new file mode 100644 index 00000000..571eca32 --- /dev/null +++ b/src/ZoneCodeGenerator/Generating/Templates/Loading/ArrayPointer.stg @@ -0,0 +1,30 @@ +// Everything related to loading a pointer with a count that can be larger than 1 + +LoadArrayPointerInner(context, structure, member) ::= << +$TypeVarName(structure)$->$member.Member.Name$ = m_stream->Alloc<$TypeDeclaration(member.Member.VariableType)$>(alignof($TypeDeclaration(member.Member.VariableType)$)); +$if(member.StructureType && !member.StructureType.IsLeaf)$ +$TypeVarName(member.StructureType)$ = $TypeVarName(structure)$->$member.Member.Name$; +LoadArray_$member.Member.VariableType.Type.Name$(true, $PrintEvaluation(member.Computations.ArrayPointerCountEvaluation)$); +$else$ +m_stream->Load<$TypeDeclaration(member.Member.VariableType)$>($TypeVarName(structure)$->$member.Member.Name$, $PrintEvaluation(member.Computations.ArrayPointerCountEvaluation)$);$endif$ +>> + +LoadArrayPointer(context, structure, member) ::= << +$if(!member.Computations.ShouldIgnore)$ +if ($TypeVarName(structure)$->$member.Member.Name$) +{ + $if(member.IsReusable)$ + if($TypeVarName(structure)$->$member.Member.Name$ == PTR_FOLLOWING) + { + $LoadArrayPointerInner(context, structure, member)$ + } + else + { + $TypeVarName(structure)$->$member.Member.Name$ = m_stream->ConvertOffsetToPointer($TypeVarName(structure)$->$member.Member.Name$); + } + $else$ + $LoadArrayPointerInner(context, structure, member)$ + $endif$ +} +$endif$ +>> \ No newline at end of file diff --git a/src/ZoneCodeGenerator/Generating/Templates/Loading/Common.stg b/src/ZoneCodeGenerator/Generating/Templates/Loading/Common.stg new file mode 100644 index 00000000..f01f1280 --- /dev/null +++ b/src/ZoneCodeGenerator/Generating/Templates/Loading/Common.stg @@ -0,0 +1,2 @@ +// Loading common +LoaderClassName(asset) ::= "Loader_$asset.Type.Name$" \ No newline at end of file diff --git a/src/ZoneCodeGenerator/Generating/Templates/Loading/SinglePointer.stg b/src/ZoneCodeGenerator/Generating/Templates/Loading/SinglePointer.stg new file mode 100644 index 00000000..05e8898e --- /dev/null +++ b/src/ZoneCodeGenerator/Generating/Templates/Loading/SinglePointer.stg @@ -0,0 +1,41 @@ +// Everything related to loading a pointer with a count that is statically 1 + +LoadSinglePointerInner(context, structure, member) ::= << +$TypeVarName(structure)$->$member.Member.Name$ = m_stream->Alloc<$TypeDeclaration(member.Member.VariableType)$>(alignof($TypeDeclaration(member.Member.VariableType)$)); +$if(member.StructureType && !member.StructureType.IsLeaf)$ +$TypeVarName(member.StructureType)$ = $TypeVarName(structure)$->$member.Member.Name$; +Load_$member.Member.VariableType.Type.Name$(true); +$else$ +m_stream->Load<$TypeDeclaration(member.Member.VariableType)$>($TypeVarName(structure)$->$member.Member.Name$);$endif$ +>> + +LoadSinglePointerAsset(context, structure, member) ::= << +$LoaderClassName(member.StructureType)$ loader(m_script_string_provider, m_zone, m_stream); +loader.Load(&$TypeVarName(structure)$->$member.Member.Name$); +>> + +LoadSinglePointer(context, structure, member) ::= << +$if(!member.Computations.ShouldIgnore)$ +$if(!member.Computations.IsArray && member.Computations.PointerDepthIsOne)$ $! TODO: FIX ARRAYS !$ +if ($TypeVarName(structure)$->$member.Member.Name$) +{ + $if(member.StructureType && member.StructureType.IsAsset)$ + $LoadSinglePointerAsset(context, structure, member)$ + $else$ + $if(member.IsReusable)$ + if($TypeVarName(structure)$->$member.Member.Name$ == PTR_FOLLOWING) + { + $LoadSinglePointerInner(context, structure, member)$ + } + else + { + $TypeVarName(structure)$->$member.Member.Name$ = m_stream->ConvertOffsetToPointer($TypeVarName(structure)$->$member.Member.Name$); + } + $else$ + $LoadSinglePointerInner(context, structure, member)$ + $endif$ + $endif$ +} +$endif$ +$endif$ +>> \ No newline at end of file diff --git a/src/ZoneCodeGenerator/Generating/Templates/Loading/String.stg b/src/ZoneCodeGenerator/Generating/Templates/Loading/String.stg new file mode 100644 index 00000000..2d60ee69 --- /dev/null +++ b/src/ZoneCodeGenerator/Generating/Templates/Loading/String.stg @@ -0,0 +1,26 @@ +// String + +LoadStringSingleDepth(context, structure, member) ::= << +$if(!member.Computations.IsArray)$ +varXString = &$TypeVarName(structure)$->$member.Member.Name$; +LoadXString(false); $\\$ +$else$ +varXString = $TypeVarName(structure)$->$member.Member.Name$; +LoadXStringArray(false, $first(member.Computations.ArraySizes)$); $\\$ +$endif$ +>> + +LoadString(context, structure, member) ::= << +$if(member.Computations.PointerDepthIsOne)$ +$LoadStringSingleDepth(context, structure, member)$ $\\$ +$elseif(member.Computations.PointerDepthIsTwo && member.Computations.ArrayPointerCountEvaluation)$ +if ($TypeVarName(structure)$->$member.Member.Name$) +{ + $TypeVarName(structure)$->$member.Member.Name$ = m_stream->Alloc<$TypeDeclaration(member.Member.VariableType)$*>(alignof($TypeDeclaration(member.Member.VariableType)$*)); + varXString = $TypeVarName(structure)$->$member.Member.Name$; + LoadXStringArray(true, $PrintEvaluation(member.Computations.ArrayPointerCountEvaluation)$); +} $\\$ +$else$ +#error Cannot load string $member.Member.Name$ $\\$ +$endif$ +>> \ No newline at end of file diff --git a/src/ZoneCodeGenerator/Generating/Templates/ZoneLoad.stg b/src/ZoneCodeGenerator/Generating/Templates/ZoneLoad.stg index fd30cfaf..905d2a98 100644 --- a/src/ZoneCodeGenerator/Generating/Templates/ZoneLoad.stg +++ b/src/ZoneCodeGenerator/Generating/Templates/ZoneLoad.stg @@ -2,6 +2,12 @@ delimiters "$", "$" import "Common.stg" +import "Loading/Common.stg" +import "Loading/String.stg" +import "Loading/ArrayPointer.stg" +import "Loading/SinglePointer.stg" + +// Loading common LoaderClassName(asset) ::= "Loader_$asset.Type.Name$" HeaderConstructor(context) ::= "$LoaderClassName(context.Asset)$(IZoneScriptStringProvider* scriptStringProvider, Zone* zone, IZoneInputStream* stream);" @@ -82,31 +88,16 @@ LoadMember(context, member) ::= << Loading member $member.Member.Name$ >> -LoadString(context, structure, member) ::= << -varXString = &$TypeVarName(structure)$->$member.Member.Name$; -LoadXString(false); ->> - -LoadArrayPointer(context, structure, member) ::= << -if ($TypeVarName(structure)$->$member.Member.Name$) -{ - $TypeVarName(structure)$->$member.Member.Name$ = m_stream->Alloc<$TypeDeclaration(member.Member.VariableType)$>(alignof($TypeDeclaration(member.Member.VariableType)$)); - $if(member.StructureType && !member.StructureType.IsLeaf)$ - $TypeVarName(member.StructureType)$ = $TypeVarName(structure)$->$member.Member.Name$; - LoadArray_$member.Member.VariableType.Type.Name$(true, $PrintEvaluation(member.Computations.ArrayPointerCountEvaluation)$); - $else$ - m_stream->Load<$TypeDeclaration(member.Member.VariableType)$>($TypeVarName(structure)$->$member.Member.Name$, $PrintEvaluation(member.Computations.ArrayPointerCountEvaluation)$); - $endif$ -} ->> LoadMemberIfNeedsTreatment(context, structure, member) ::= << $if(member.IsString)$ $LoadString(context, structure, member)$ $elseif(member.IsScriptString)$ // Load scriptstring for $member.Member.Name$ -$elseif(member.Computations.IsArrayPointerReference && member.Computations.IsSinglePointer)$ +$elseif(member.Computations.IsArrayPointerReference && member.Computations.PointerDepthIsOne)$ $LoadArrayPointer(context, structure, member)$ +$elseif(member.Computations.IsSinglePointerReference)$ +$LoadSinglePointer(context, structure, member)$ $endif$ >>