From 63722e220d04b4b360cb3e7b999c84c47823abac Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 14 Nov 2019 14:57:21 +0100 Subject: [PATCH] ZoneCodeGenerator: Move computed conditions to sub class for MemberInformation since the template engine does not support computations and there will be a decent amount probably. So they are now moved to a different class to not cludder the main class too much --- .../Domain/Information/MemberInformation.cs | 19 ++----- .../Computations/MemberComputations.cs | 49 +++++++++++++++++++ .../PostProcessor/PostProcessorUsages.cs | 8 +-- .../Parsing/CommandFile/Tests/TestString.cs | 2 +- 4 files changed, 58 insertions(+), 20 deletions(-) create mode 100644 src/ZoneCodeGenerator/Generating/Computations/MemberComputations.cs diff --git a/src/ZoneCodeGenerator/Domain/Information/MemberInformation.cs b/src/ZoneCodeGenerator/Domain/Information/MemberInformation.cs index ca1ca21b..2801cae6 100644 --- a/src/ZoneCodeGenerator/Domain/Information/MemberInformation.cs +++ b/src/ZoneCodeGenerator/Domain/Information/MemberInformation.cs @@ -1,5 +1,7 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using ZoneCodeGenerator.Domain.Evaluation; +using ZoneCodeGenerator.Generating.Computations; namespace ZoneCodeGenerator.Domain.Information { @@ -11,20 +13,7 @@ namespace ZoneCodeGenerator.Domain.Information public bool IsScriptString { get; set; } public IEvaluation Condition { get; set; } - public bool IsNonEmbeddedReference => Member.VariableType.References.Any(); - - public bool IsSinglePointerReference => Member.VariableType.References.Any() - && Member.VariableType.References.Last() is ReferenceTypePointer - pointerReference - && !pointerReference.IsArray; - - public bool IsArrayPointerReference => Member.VariableType.References.Any() - && Member.VariableType.References.Last() is ReferenceTypePointer - pointerReference - && pointerReference.IsArray; - - public bool IsArrayReference => Member.VariableType.References.Any() - && Member.VariableType.References.Last() is ReferenceTypeArray; + public MemberComputations Computations => new MemberComputations(this); public MemberInformation(Variable member, StructureInformation structureType) { diff --git a/src/ZoneCodeGenerator/Generating/Computations/MemberComputations.cs b/src/ZoneCodeGenerator/Generating/Computations/MemberComputations.cs new file mode 100644 index 00000000..5d88f196 --- /dev/null +++ b/src/ZoneCodeGenerator/Generating/Computations/MemberComputations.cs @@ -0,0 +1,49 @@ +using System.Collections.Generic; +using System.Linq; +using ZoneCodeGenerator.Domain; +using ZoneCodeGenerator.Domain.Evaluation; +using ZoneCodeGenerator.Domain.Information; + +namespace ZoneCodeGenerator.Generating.Computations +{ + class MemberComputations + { + private readonly MemberInformation information; + + public bool IsNonEmbeddedReference => information.Member.VariableType.References.OfType().Any(); + + public bool IsSinglePointerReference => information.Member.VariableType.References.Any() + && information.Member.VariableType.References.Last() is ReferenceTypePointer + pointerReference + && !pointerReference.IsArray; + + public bool IsArrayPointerReference => information.Member.VariableType.References.Any() + && information.Member.VariableType.References.Last() is ReferenceTypePointer + pointerReference + && pointerReference.IsArray; + + public IEvaluation ArrayPointerCountEvaluation => + information.Member.VariableType.References.Last() is ReferenceTypePointer pointerReference + ? pointerReference.Count + : null; + + public bool IsArrayReference => information.Member.VariableType.References.Any() + && information.Member.VariableType.References.Last() is ReferenceTypeArray; + + public IEnumerable ArraySizes => information.Member.VariableType.References + .OfType() + .Select(array => array.ArraySize); + + public int PointerDepth => information.Member.VariableType.References + .OfType() + .Count(); + + public bool IsSinglePointer => PointerDepth == 1; + public bool IsDoublePointer => PointerDepth == 2; + + public MemberComputations(MemberInformation information) + { + this.information = information; + } + } +} \ No newline at end of file diff --git a/src/ZoneCodeGenerator/Parsing/CommandFile/PostProcessor/PostProcessorUsages.cs b/src/ZoneCodeGenerator/Parsing/CommandFile/PostProcessor/PostProcessorUsages.cs index 411e0708..000de746 100644 --- a/src/ZoneCodeGenerator/Parsing/CommandFile/PostProcessor/PostProcessorUsages.cs +++ b/src/ZoneCodeGenerator/Parsing/CommandFile/PostProcessor/PostProcessorUsages.cs @@ -20,16 +20,16 @@ namespace ZoneCodeGenerator.Parsing.CommandFile.PostProcessor memberInformation.StructureType.Usages.Add(information); - if (memberInformation.IsNonEmbeddedReference) + if (memberInformation.Computations.IsNonEmbeddedReference) memberInformation.StructureType.NonEmbeddedReferenceExists = true; - if (memberInformation.IsSinglePointerReference) + if (memberInformation.Computations.IsSinglePointerReference) memberInformation.StructureType.SinglePointerReferenceExists = true; - if (memberInformation.IsArrayPointerReference) + if (memberInformation.Computations.IsArrayPointerReference) memberInformation.StructureType.ArrayPointerReferenceExists = true; - if (memberInformation.IsArrayReference) + if (memberInformation.Computations.IsArrayReference) memberInformation.StructureType.ArrayReferenceExists = true; } } diff --git a/src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestString.cs b/src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestString.cs index b777c72a..5bd68340 100644 --- a/src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestString.cs +++ b/src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestString.cs @@ -56,7 +56,7 @@ namespace ZoneCodeGenerator.Parsing.CommandFile.Tests throw new TestFailedException($"Specified member '{lastMember.Member.Name}' is not char type and therefore cannot be a string."); } - if (!lastMember.IsSinglePointerReference) + if (!lastMember.Computations.IsSinglePointerReference) { throw new TestFailedException($"Specified member '{lastMember.Member.Name}' is a single pointer reference and therefore cannot be a string."); }