From 2747e1f0f211ded6d270f60143ddc2b7b6676128 Mon Sep 17 00:00:00 2001 From: Jan Date: Fri, 19 Feb 2021 01:11:06 +0100 Subject: [PATCH] resolve forward declarations --- .../Parsing/Header/Impl/HeaderParser.cpp | 2 +- .../Parsing/Header/Impl/HeaderParser.h | 2 +- .../Parsing/Header/Impl/HeaderParserState.cpp | 101 ++++++++++++++++-- .../Parsing/Header/Impl/HeaderParserState.h | 8 +- 4 files changed, 104 insertions(+), 9 deletions(-) diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.cpp index eab8926a..2b6bee8b 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.cpp @@ -13,7 +13,7 @@ const std::vector& HeaderParser::GetTestsForState() return m_state->GetBlock()->GetTestsForBlock(); } -void HeaderParser::SaveToRepository(IDataRepository* repository) const +bool HeaderParser::SaveToRepository(IDataRepository* repository) const { return m_state->SaveToRepository(repository); } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.h index 12aa5ad5..a52bbaba 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.h @@ -14,5 +14,5 @@ protected: public: HeaderParser(HeaderLexer* lexer, const IPackValueSupplier* packValueSupplier); - void SaveToRepository(IDataRepository* repository) const; + bool SaveToRepository(IDataRepository* repository) const; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.cpp index cca891ea..93b4aeae 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.cpp @@ -1,5 +1,8 @@ #include "HeaderParserState.h" +#include + + #include "Domain/Definition/EnumDefinition.h" #include "Parsing/Header/Block/HeaderBlockNone.h" @@ -9,7 +12,7 @@ HeaderParserState::HeaderParserState(const IPackValueSupplier* packValueSupplier { m_blocks.push(std::make_unique()); - for(auto i = 0u; i < BaseTypeDefinition::ALL_BASE_TYPES_COUNT; i++) + for (auto i = 0u; i < BaseTypeDefinition::ALL_BASE_TYPES_COUNT; i++) AddBaseDataType(BaseTypeDefinition::ALL_BASE_TYPES[i]); } @@ -43,9 +46,9 @@ void HeaderParserState::PopBlock() void HeaderParserState::AddDataType(std::unique_ptr definition) { - if(definition->GetType() == DataDefinitionType::ENUM) + if (definition->GetType() == DataDefinitionType::ENUM) { - for(const auto& enumMember : dynamic_cast(definition.get())->m_members) + for (const auto& enumMember : dynamic_cast(definition.get())->m_members) { m_enum_members.insert(std::make_pair(enumMember->m_name, enumMember.get())); } @@ -86,11 +89,88 @@ EnumMember* HeaderParserState::FindEnumMember(const std::string& enumMemberName) return nullptr; } -void HeaderParserState::SaveToRepository(IDataRepository* repository) +bool HeaderParserState::ResolveForwardDeclarations() { - for(auto& definition : m_header_definitions) + for (auto& [_, forwardDeclaration] : m_forward_declarations) { - switch(definition->GetType()) + const auto* dataDefinition = FindType(forwardDeclaration->GetFullName()); + + if (dataDefinition == nullptr) + { + std::cout << "Forward declaration \"" << forwardDeclaration->GetFullName() << "\" was not defined" << std::endl; + return false; + } + + forwardDeclaration->m_definition = dataDefinition; + } + + return true; +} + +bool HeaderParserState::ReplaceForwardDeclarationsInStruct(StructDefinition* structDefinition) +{ + for (const auto& variable : structDefinition->m_members) + { + if (variable->m_type_declaration->m_type->GetType() == DataDefinitionType::FORWARD_DECLARATION) + variable->m_type_declaration->m_type = dynamic_cast(variable->m_type_declaration->m_type)->m_definition; + } + + return true; +} + +bool HeaderParserState::ReplaceForwardDeclarationsInTypedef(TypedefDefinition* typedefDefinition) +{ + if (typedefDefinition->m_type_declaration->m_type->GetType() == DataDefinitionType::FORWARD_DECLARATION) + typedefDefinition->m_type_declaration->m_type = dynamic_cast(typedefDefinition->m_type_declaration->m_type)->m_definition; + + return true; +} + +bool HeaderParserState::ReplaceForwardDeclarationsInUnion(UnionDefinition* unionDefinition) +{ + for (const auto& variable : unionDefinition->m_members) + { + if (variable->m_type_declaration->m_type->GetType() == DataDefinitionType::FORWARD_DECLARATION) + variable->m_type_declaration->m_type = dynamic_cast(variable->m_type_declaration->m_type)->m_definition; + } + + return true; +} + +bool HeaderParserState::ReplaceForwardDeclarationsInDefinitions() +{ + for (auto& definition : m_header_definitions) + { + switch (definition->GetType()) + { + case DataDefinitionType::STRUCT: + if (!ReplaceForwardDeclarationsInStruct(dynamic_cast(definition.get()))) + return false; + break; + + case DataDefinitionType::TYPEDEF: + if (!ReplaceForwardDeclarationsInTypedef(dynamic_cast(definition.get()))) + return false; + break; + + case DataDefinitionType::UNION: + if (!ReplaceForwardDeclarationsInUnion(dynamic_cast(definition.get()))) + return false; + break; + + default: + break; + } + } + + return true; +} + +bool HeaderParserState::MoveDefinitionsToRepository(IDataRepository* repository) +{ + for (auto& definition : m_header_definitions) + { + switch (definition->GetType()) { case DataDefinitionType::ENUM: repository->Add(std::unique_ptr(dynamic_cast(definition.release()))); @@ -112,4 +192,13 @@ void HeaderParserState::SaveToRepository(IDataRepository* repository) break; } } + + return true; +} + +bool HeaderParserState::SaveToRepository(IDataRepository* repository) +{ + return ResolveForwardDeclarations() + && ReplaceForwardDeclarationsInDefinitions() + && MoveDefinitionsToRepository(repository); } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.h index d71079e6..e0b6b4c9 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.h @@ -26,6 +26,12 @@ class HeaderParserState std::unordered_map> m_forward_declarations; void AddBaseDataType(const BaseTypeDefinition* baseType); + bool ResolveForwardDeclarations(); + static bool ReplaceForwardDeclarationsInStruct(StructDefinition* structDefinition); + static bool ReplaceForwardDeclarationsInTypedef(TypedefDefinition* typedefDefinition); + static bool ReplaceForwardDeclarationsInUnion(UnionDefinition* unionDefinition); + bool ReplaceForwardDeclarationsInDefinitions(); + bool MoveDefinitionsToRepository(IDataRepository* repository); public: const IPackValueSupplier* const m_pack_value_supplier; @@ -43,5 +49,5 @@ public: const DataDefinition* FindType(const std::string& typeName); EnumMember* FindEnumMember(const std::string& enumMemberName); - void SaveToRepository(IDataRepository* repository); + bool SaveToRepository(IDataRepository* repository); };