diff --git a/src/ZoneCodeGeneratorLib/Generating/RenderingContext.cpp b/src/ZoneCodeGeneratorLib/Generating/RenderingContext.cpp index 6828e061..5e40e0a5 100644 --- a/src/ZoneCodeGeneratorLib/Generating/RenderingContext.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/RenderingContext.cpp @@ -45,7 +45,7 @@ RenderingUsedType* RenderingContext::AddUsedType(std::unique_ptrm_type->GetType() == DataDefinitionType::TYPEDEF) { @@ -54,9 +54,18 @@ RenderingUsedType* RenderingContext::GetBaseType(RenderingUsedType* usedType) while(typedefDefinition->m_type_declaration->m_type->GetType() == DataDefinitionType::TYPEDEF) typedefDefinition = dynamic_cast(typedefDefinition->m_type_declaration->m_type); - const auto foundUsedType = m_used_types_lookup.find(typedefDefinition); + const auto foundUsedType = m_used_types_lookup.find(typedefDefinition->m_type_declaration->m_type); if(foundUsedType == m_used_types_lookup.end()) - return AddUsedType(std::make_unique(typedefDefinition->m_type_declaration->m_type, nullptr)); + { + const auto* memberDef = dynamic_cast(typedefDefinition->m_type_declaration->m_type); + StructureInformation* info = nullptr; + if (memberDef) + info = repository->GetInformationFor(memberDef); + + auto* addedUsedType = AddUsedType(std::make_unique(typedefDefinition->m_type_declaration->m_type, info)); + ScanUsedTypeIfNeeded(repository, computations, usedType); + return addedUsedType; + } return foundUsedType->second.get(); } @@ -64,7 +73,7 @@ RenderingUsedType* RenderingContext::GetBaseType(RenderingUsedType* usedType) return nullptr; } -void RenderingContext::AddMembersToContext(StructureInformation* info) +void RenderingContext::AddMembersToContext(const IDataRepository* repository, StructureInformation* info) { for(const auto& member : info->m_ordered_members) { @@ -80,7 +89,7 @@ void RenderingContext::AddMembersToContext(StructureInformation* info) else usedType = existingUsedType->second.get(); - auto* baseUsedType = GetBaseType(usedType); + auto* baseUsedType = GetBaseType(repository, &computations, usedType); if(!computations.IsInRuntimeBlock()) { @@ -104,20 +113,25 @@ void RenderingContext::AddMembersToContext(StructureInformation* info) usedType->m_pointer_array_reference_is_reusable = true; } - if(usedType->m_info != nullptr && !StructureComputations(usedType->m_info).IsAsset() && !computations.IsInRuntimeBlock() && !usedType->m_members_loaded) - { - usedType->m_members_loaded = true; - AddMembersToContext(usedType->m_info); - } + ScanUsedTypeIfNeeded(repository, &computations, usedType); } } -void RenderingContext::MakeAsset(StructureInformation* asset) +void RenderingContext::ScanUsedTypeIfNeeded(const IDataRepository* repository, MemberComputations* computations, RenderingUsedType* usedType) +{ + if (usedType->m_info != nullptr && !StructureComputations(usedType->m_info).IsAsset() && !computations->IsInRuntimeBlock() && !usedType->m_members_loaded) + { + usedType->m_members_loaded = true; + AddMembersToContext(repository, usedType->m_info); + } +} + +void RenderingContext::MakeAsset(const IDataRepository* repository, StructureInformation* asset) { m_asset = asset; AddUsedType(std::make_unique(asset->m_definition, asset)); - AddMembersToContext(asset); + AddMembersToContext(repository, asset); } void RenderingContext::CreateUsedTypeCollections() @@ -152,7 +166,7 @@ std::unique_ptr RenderingContext::BuildContext(const IDataRepo { auto context = std::make_unique(RenderingContext(repository->GetGameName(), repository->GetAllFastFileBlocks())); - context->MakeAsset(asset); + context->MakeAsset(repository, asset); context->CreateUsedTypeCollections(); return std::move(context); diff --git a/src/ZoneCodeGeneratorLib/Generating/RenderingContext.h b/src/ZoneCodeGeneratorLib/Generating/RenderingContext.h index a61d8ca7..cf9edef5 100644 --- a/src/ZoneCodeGeneratorLib/Generating/RenderingContext.h +++ b/src/ZoneCodeGeneratorLib/Generating/RenderingContext.h @@ -3,6 +3,7 @@ #include #include +#include "Domain/Computations/MemberComputations.h" #include "Domain/Information/StructureInformation.h" #include "Persistence/IDataRepository.h" @@ -30,9 +31,10 @@ class RenderingContext RenderingContext(std::string game, std::vector fastFileBlocks); RenderingUsedType* AddUsedType(std::unique_ptr usedType); - RenderingUsedType* GetBaseType(RenderingUsedType* usedType); - void AddMembersToContext(StructureInformation* info); - void MakeAsset(StructureInformation* asset); + RenderingUsedType* GetBaseType(const IDataRepository* repository, MemberComputations* computations, RenderingUsedType* usedType); + void AddMembersToContext(const IDataRepository* repository, StructureInformation* info); + void ScanUsedTypeIfNeeded(const IDataRepository* repository, MemberComputations* computations, RenderingUsedType* usedType); + void MakeAsset(const IDataRepository* repository, StructureInformation* asset); void CreateUsedTypeCollections(); public: diff --git a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateMemberInformationPostProcessor.cpp b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateMemberInformationPostProcessor.cpp index c07052f4..5bd9b5c5 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateMemberInformationPostProcessor.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/PostProcessing/CreateMemberInformationPostProcessor.cpp @@ -7,7 +7,14 @@ bool CreateMemberInformationPostProcessor::CreateMemberInformationForStructure(I for(const auto& member : structure->m_definition->m_members) { StructureInformation* typeInfo = nullptr; - const auto* memberDefinition = dynamic_cast(member->m_type_declaration->m_type); + const auto* currentDefinition = member->m_type_declaration->m_type; + + while(currentDefinition->GetType() == DataDefinitionType::TYPEDEF) + { + currentDefinition = dynamic_cast(currentDefinition)->m_type_declaration->m_type; + } + + const auto* memberDefinition = dynamic_cast(currentDefinition); if(memberDefinition != nullptr) typeInfo = repository->GetInformationFor(memberDefinition);