From b79f2370141cf1f384733608e98bf8403e20f262 Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 21 Nov 2019 21:42:07 +0100 Subject: [PATCH] ZoneCodeGenerator: Make Usages PostProcessor only add usages when a member is used and not ignored --- .../PostProcessor/PostProcessorUsages.cs | 54 +++++++++++++------ 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/src/ZoneCodeGenerator/Parsing/CommandFile/PostProcessor/PostProcessorUsages.cs b/src/ZoneCodeGenerator/Parsing/CommandFile/PostProcessor/PostProcessorUsages.cs index 000de746..b731146a 100644 --- a/src/ZoneCodeGenerator/Parsing/CommandFile/PostProcessor/PostProcessorUsages.cs +++ b/src/ZoneCodeGenerator/Parsing/CommandFile/PostProcessor/PostProcessorUsages.cs @@ -1,40 +1,60 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using ZoneCodeGenerator.Domain; +using ZoneCodeGenerator.Domain.Information; using ZoneCodeGenerator.Persistence; namespace ZoneCodeGenerator.Parsing.CommandFile.PostProcessor { class PostProcessorUsages : IDataPostProcessor { - public bool PostProcess(IDataRepository repository) + private static bool ProcessAsset(StructureInformation assetStructure) { - foreach (var dataTypeWithMembers in repository.GetAllStructs() - .AsEnumerable() - .Concat(repository.GetAllUnions())) + var processedAssets = new HashSet(); + var processingQueue = new Queue(); + processingQueue.Enqueue(assetStructure); + + while (processingQueue.Count != 0) { - var information = repository.GetInformationFor(dataTypeWithMembers); + var currentStructure = processingQueue.Dequeue(); - foreach (var memberInformation in information.OrderedMembers) + if (!processedAssets.Add(currentStructure)) { - if (memberInformation.StructureType == null) continue; + continue; + } - memberInformation.StructureType.Usages.Add(information); + foreach (var member in currentStructure.OrderedMembers + .Where(member => member.StructureType != null) + .Where(member => !member.Computations.ShouldIgnore)) + { + if (member.Computations.IsNonEmbeddedReference) + member.StructureType.NonEmbeddedReferenceExists = true; - if (memberInformation.Computations.IsNonEmbeddedReference) - memberInformation.StructureType.NonEmbeddedReferenceExists = true; + if (member.Computations.IsSinglePointerReference) + member.StructureType.SinglePointerReferenceExists = true; - if (memberInformation.Computations.IsSinglePointerReference) - memberInformation.StructureType.SinglePointerReferenceExists = true; + if (member.Computations.IsArrayPointerReference) + member.StructureType.ArrayPointerReferenceExists = true; - if (memberInformation.Computations.IsArrayPointerReference) - memberInformation.StructureType.ArrayPointerReferenceExists = true; + if (member.Computations.IsArrayReference) + member.StructureType.ArrayReferenceExists = true; - if (memberInformation.Computations.IsArrayReference) - memberInformation.StructureType.ArrayReferenceExists = true; + member.StructureType.Usages.Add(currentStructure); + processingQueue.Enqueue(member.StructureType); } } return true; } + + public bool PostProcess(IDataRepository repository) + { + return repository.GetAllStructs() + .AsEnumerable() + .Concat(repository.GetAllUnions()) + .Select(repository.GetInformationFor) + .Where(information => information.IsAsset) + .All(ProcessAsset); + } } } \ No newline at end of file