From f0753c7e3cbc881c5c52a5b7dfabeeb014715d69 Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 18 Feb 2021 22:21:58 +0100 Subject: [PATCH] handle variable defines in child block close --- .../Header/Block/HeaderBlockStruct.cpp | 32 +++++++++++-------- .../Parsing/Header/Block/HeaderBlockStruct.h | 1 + .../Parsing/Header/Block/HeaderBlockUnion.cpp | 30 +++++++++-------- .../Parsing/Header/Block/HeaderBlockUnion.h | 1 + 4 files changed, 37 insertions(+), 27 deletions(-) diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.cpp index 9be57232..a322bcfe 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.cpp @@ -12,7 +12,8 @@ HeaderBlockStruct::HeaderBlockStruct(std::string name, const bool isTypedef) m_struct_definition(nullptr), m_custom_alignment(0), m_is_typedef(isTypedef), - m_has_custom_align(false) + m_has_custom_align(false), + m_is_anonymous(false) { } @@ -38,27 +39,26 @@ void HeaderBlockStruct::OnOpen(HeaderParserState* state) { m_namespace = state->m_namespace.ToString(); - if (!m_type_name.empty()) + if (m_type_name.empty()) + { + m_is_anonymous = true; + m_type_name = NameUtils::GenerateRandomName(); + } + else + { state->m_namespace.Push(m_type_name); + } } void HeaderBlockStruct::OnClose(HeaderParserState* state) { - if (!m_type_name.empty()) + if (!m_is_anonymous) state->m_namespace.Pop(); - auto isAnonymous = false; - auto typeName = m_type_name; - if(typeName.empty()) - { - isAnonymous = true; - typeName = NameUtils::GenerateRandomName(); - } - - auto structDefinition = std::make_unique(m_namespace, std::move(typeName), state->m_pack_value_supplier->GetCurrentPack()); + auto structDefinition = std::make_unique(m_namespace, m_type_name, state->m_pack_value_supplier->GetCurrentPack()); m_struct_definition = structDefinition.get(); - if (isAnonymous) + if (m_is_anonymous) structDefinition->m_anonymous = true; for (auto& member : m_members) @@ -72,6 +72,10 @@ void HeaderBlockStruct::OnClose(HeaderParserState* state) void HeaderBlockStruct::OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) { + auto* variableDefining = dynamic_cast(block); + + if (variableDefining && variableDefining->IsDefiningVariable()) + m_members.emplace_back(std::make_shared(variableDefining->GetVariableName(), std::make_unique(variableDefining->GetVariableType()))); } void HeaderBlockStruct::AddVariable(std::shared_ptr variable) @@ -87,7 +91,7 @@ void HeaderBlockStruct::SetCustomAlignment(const int alignment) void HeaderBlockStruct::Inherit(const StructDefinition* parentStruct) { - for(const auto& parentMember : parentStruct->m_members) + for (const auto& parentMember : parentStruct->m_members) AddVariable(parentMember); } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.h index fabbfa25..d914a46a 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.h @@ -19,6 +19,7 @@ class HeaderBlockStruct final : public IHeaderBlock, public IHeaderBlockNameHold bool m_is_typedef; bool m_has_custom_align; + bool m_is_anonymous; std::string m_variable_name; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.cpp index df7f4179..c93c69f2 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.cpp @@ -12,7 +12,8 @@ HeaderBlockUnion::HeaderBlockUnion(std::string name, const bool isTypedef) m_union_definition(nullptr), m_custom_alignment(0), m_is_typedef(isTypedef), - m_has_custom_align(false) + m_has_custom_align(false), + m_is_anonymous(false) { } @@ -38,27 +39,26 @@ void HeaderBlockUnion::OnOpen(HeaderParserState* state) { m_namespace = state->m_namespace.ToString(); - if (!m_type_name.empty()) + if (m_type_name.empty()) + { + m_is_anonymous = true; + m_type_name = NameUtils::GenerateRandomName(); + } + else + { state->m_namespace.Push(m_type_name); + } } void HeaderBlockUnion::OnClose(HeaderParserState* state) { - if (!m_type_name.empty()) + if (!m_is_anonymous) state->m_namespace.Pop(); - auto isAnonymous = false; - auto typeName = m_type_name; - if (typeName.empty()) - { - isAnonymous = true; - typeName = NameUtils::GenerateRandomName(); - } - - auto unionDefinition = std::make_unique(m_namespace, std::move(typeName), state->m_pack_value_supplier->GetCurrentPack()); + auto unionDefinition = std::make_unique(m_namespace, m_type_name, state->m_pack_value_supplier->GetCurrentPack()); m_union_definition = unionDefinition.get(); - if (isAnonymous) + if (m_is_anonymous) unionDefinition->m_anonymous = true; for (auto& member : m_members) @@ -72,6 +72,10 @@ void HeaderBlockUnion::OnClose(HeaderParserState* state) void HeaderBlockUnion::OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) { + auto* variableDefining = dynamic_cast(block); + + if (variableDefining && variableDefining->IsDefiningVariable()) + m_members.emplace_back(std::make_shared(variableDefining->GetVariableName(), std::make_unique(variableDefining->GetVariableType()))); } void HeaderBlockUnion::AddVariable(std::shared_ptr variable) diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.h index 6db46585..edcbd25f 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.h @@ -15,6 +15,7 @@ class HeaderBlockUnion final : public IHeaderBlock, public IHeaderBlockNameHolde bool m_is_typedef; bool m_has_custom_align; + bool m_is_anonymous; std::string m_variable_name;