From 5d5fc8692351b307bb5dc6621a56f706f4c4c109 Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 18 Feb 2021 17:15:46 +0100 Subject: [PATCH] create enum definitions from headers --- .../Domain/Definition/BaseTypeDefinition.cpp | 19 +---- .../Domain/Definition/BaseTypeDefinition.h | 10 ++- .../Domain/Definition/DataDefinition.h | 6 +- .../Definition/DefinitionWithMembers.cpp | 61 ++++++++-------- .../Domain/Definition/DefinitionWithMembers.h | 13 ++-- .../Domain/Definition/EnumDefinition.cpp | 6 +- .../Domain/Definition/EnumDefinition.h | 6 +- .../Domain/Definition/ForwardDeclaration.cpp | 6 +- .../Domain/Definition/ForwardDeclaration.h | 6 +- .../Domain/Definition/StructDefinition.cpp | 70 +++++++++---------- .../Domain/Definition/StructDefinition.h | 4 +- .../Domain/Definition/TypedefDefinition.cpp | 6 +- .../Domain/Definition/TypedefDefinition.h | 6 +- .../Domain/Definition/UnionDefinition.cpp | 30 ++++---- .../Domain/Definition/UnionDefinition.h | 4 +- .../Matcher/CommandsCommonMatchers.cpp | 2 +- .../Parsing/Header/Block/HeaderBlockEnum.cpp | 48 ++++++++++++- .../Parsing/Header/Block/HeaderBlockEnum.h | 21 +++++- .../Header/Block/HeaderBlockStruct.cpp | 4 +- .../Parsing/Header/Block/HeaderBlockStruct.h | 8 +-- .../Parsing/Header/Block/HeaderBlockUnion.cpp | 2 +- .../Parsing/Header/Block/HeaderBlockUnion.h | 8 +-- .../Header/Block/IHeaderBlockNameHolder.h | 16 +++++ .../Block/IHeaderBlockVariableDefining.h | 6 +- .../Parsing/Header/HeaderFileReader.cpp | 4 +- .../Parsing/Header/Impl/HeaderParser.cpp | 10 ++- .../Parsing/Header/Impl/HeaderParser.h | 6 +- .../Parsing/Header/Impl/HeaderParserState.cpp | 54 ++++++++++++++ .../Parsing/Header/Impl/HeaderParserState.h | 19 +++++ .../Header/Matcher/HeaderCommonMatchers.cpp | 2 +- .../Header/Sequence/SequenceCloseBlock.cpp | 8 +-- .../Parsing/Header/Sequence/SequenceEnum.cpp | 24 ++++++- .../Parsing/Sequence/SequenceResult.h | 15 ++++ .../Utils/NamespaceBuilder.cpp | 3 + 34 files changed, 350 insertions(+), 163 deletions(-) create mode 100644 src/ZoneCodeGeneratorLib/Parsing/Header/Block/IHeaderBlockNameHolder.h diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/BaseTypeDefinition.cpp b/src/ZoneCodeGeneratorLib/Domain/Definition/BaseTypeDefinition.cpp index 2ad95a7a..5450dfbd 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/BaseTypeDefinition.cpp +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/BaseTypeDefinition.cpp @@ -11,32 +11,16 @@ DataDefinitionType BaseTypeDefinition::GetType() const return DataDefinitionType::BASE_TYPE; } -unsigned BaseTypeDefinition::GetAlignment() -{ - // Since this type has no members the alignment is always equal to the size. - return m_size; -} - unsigned BaseTypeDefinition::GetAlignment() const { return m_size; } -bool BaseTypeDefinition::GetForceAlignment() -{ - return false; -} - bool BaseTypeDefinition::GetForceAlignment() const { return false; } -unsigned BaseTypeDefinition::GetSize() -{ - return m_size; -} - unsigned BaseTypeDefinition::GetSize() const { return m_size; @@ -72,4 +56,5 @@ const BaseTypeDefinition* const BaseTypeDefinition::ALL_BASE_TYPES[] LONG_LONG, UNSIGNED_LONG_LONG, VOID -}; \ No newline at end of file +}; +const size_t BaseTypeDefinition::ALL_BASE_TYPES_COUNT = _countof(ALL_BASE_TYPES); \ No newline at end of file diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/BaseTypeDefinition.h b/src/ZoneCodeGeneratorLib/Domain/Definition/BaseTypeDefinition.h index ab64f27f..7a10733f 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/BaseTypeDefinition.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/BaseTypeDefinition.h @@ -11,12 +11,9 @@ private: public: _NODISCARD DataDefinitionType GetType() const override; - _NODISCARD unsigned GetAlignment() override; - _NODISCARD unsigned GetAlignment() const; - _NODISCARD bool GetForceAlignment() override; - _NODISCARD bool GetForceAlignment() const; - _NODISCARD unsigned GetSize() override; - _NODISCARD unsigned GetSize() const; + _NODISCARD unsigned GetAlignment() const override; + _NODISCARD bool GetForceAlignment() const override; + _NODISCARD unsigned GetSize() const override; static const BaseTypeDefinition* const FLOAT; static const BaseTypeDefinition* const DOUBLE; @@ -34,4 +31,5 @@ public: static const BaseTypeDefinition* const VOID; static const BaseTypeDefinition* const ALL_BASE_TYPES[]; + static const size_t ALL_BASE_TYPES_COUNT; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/DataDefinition.h b/src/ZoneCodeGeneratorLib/Domain/Definition/DataDefinition.h index 8e7a3985..c3e0ba90 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/DataDefinition.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/DataDefinition.h @@ -29,9 +29,9 @@ public: std::string m_name; _NODISCARD virtual DataDefinitionType GetType() const = 0; - _NODISCARD virtual unsigned GetAlignment() = 0; - _NODISCARD virtual bool GetForceAlignment() = 0; - _NODISCARD virtual unsigned GetSize() = 0; + _NODISCARD virtual unsigned GetAlignment() const = 0; + _NODISCARD virtual bool GetForceAlignment() const = 0; + _NODISCARD virtual unsigned GetSize() const = 0; _NODISCARD std::string GetFullName() const; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/DefinitionWithMembers.cpp b/src/ZoneCodeGeneratorLib/Domain/Definition/DefinitionWithMembers.cpp index 80a54bcd..bd076fa2 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/DefinitionWithMembers.cpp +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/DefinitionWithMembers.cpp @@ -1,5 +1,7 @@ #include "DefinitionWithMembers.h" +#include + DefinitionWithMembers::DefinitionWithMembers(std::string _namespace, std::string name, const unsigned pack) : DataDefinition(std::move(_namespace), std::move(name)), m_flags(0), @@ -12,46 +14,49 @@ DefinitionWithMembers::DefinitionWithMembers(std::string _namespace, std::string { } -void DefinitionWithMembers::CalculateAlignment() -{ - if (m_has_alignment_override) - { - m_flags |= FLAG_ALIGNMENT_FORCED; - m_alignment = m_alignment_override; - } - else - { - m_alignment = 0; - for (const auto& member : m_members) - { - const auto memberAlignment = member->GetAlignment(); - if (memberAlignment > m_alignment) - m_alignment = memberAlignment; - } - } - m_flags |= FLAG_ALIGNMENT_CALCULATED; -} +//void DefinitionWithMembers::CalculateAlignment() +//{ +// if (m_has_alignment_override) +// { +// m_flags |= FLAG_ALIGNMENT_FORCED; +// m_alignment = m_alignment_override; +// } +// else +// { +// m_alignment = 0; +// for (const auto& member : m_members) +// { +// const auto memberAlignment = member->GetAlignment(); +// if (memberAlignment > m_alignment) +// m_alignment = memberAlignment; +// } +// } +// m_flags |= FLAG_ALIGNMENT_CALCULATED; +//} -unsigned DefinitionWithMembers::GetAlignment() +unsigned DefinitionWithMembers::GetAlignment() const { - if ((m_flags & FLAG_ALIGNMENT_CALCULATED) == 0) - CalculateAlignment(); + assert(m_flags & FLAG_ALIGNMENT_CALCULATED); + /*if ((m_flags & FLAG_ALIGNMENT_CALCULATED) == 0) + CalculateAlignment();*/ return m_alignment; } -bool DefinitionWithMembers::GetForceAlignment() +bool DefinitionWithMembers::GetForceAlignment() const { - if ((m_flags & FLAG_ALIGNMENT_CALCULATED) == 0) - CalculateAlignment(); + assert(m_flags & FLAG_ALIGNMENT_CALCULATED); + /*if ((m_flags & FLAG_ALIGNMENT_CALCULATED) == 0) + CalculateAlignment();*/ return m_flags & FLAG_ALIGNMENT_FORCED; } -unsigned DefinitionWithMembers::GetSize() +unsigned DefinitionWithMembers::GetSize() const { - if ((m_flags & FLAG_SIZE_CALCULATED) == 0) - CalculateSize(); + assert(m_flags & FLAG_SIZE_CALCULATED); + /*if ((m_flags & FLAG_SIZE_CALCULATED) == 0) + CalculateSize();*/ return m_size; } diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/DefinitionWithMembers.h b/src/ZoneCodeGeneratorLib/Domain/Definition/DefinitionWithMembers.h index 29ec52a0..e5cc8934 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/DefinitionWithMembers.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/DefinitionWithMembers.h @@ -8,7 +8,7 @@ class DefinitionWithMembers : public DataDefinition { -protected: +public: static constexpr int FLAG_SIZE_CALCULATED = 1 << 0; static constexpr int FLAG_ALIGNMENT_CALCULATED = 1 << 1; static constexpr int FLAG_ALIGNMENT_FORCED = 1 << 2; @@ -17,10 +17,9 @@ protected: unsigned m_size; unsigned m_alignment; - virtual void CalculateSize() = 0; - void CalculateAlignment(); + /*virtual void CalculateSize() = 0; + void CalculateAlignment();*/ -public: bool m_has_alignment_override; bool m_anonymous; @@ -31,7 +30,7 @@ public: DefinitionWithMembers(std::string _namespace, std::string name, unsigned pack); - _NODISCARD unsigned GetAlignment() override; - _NODISCARD bool GetForceAlignment() override; - _NODISCARD unsigned GetSize() override; + _NODISCARD unsigned GetAlignment() const override; + _NODISCARD bool GetForceAlignment() const override; + _NODISCARD unsigned GetSize() const override; }; \ No newline at end of file diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/EnumDefinition.cpp b/src/ZoneCodeGeneratorLib/Domain/Definition/EnumDefinition.cpp index 02d2577c..283309aa 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/EnumDefinition.cpp +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/EnumDefinition.cpp @@ -14,17 +14,17 @@ DataDefinitionType EnumDefinition::GetType() const return DataDefinitionType::ENUM; } -unsigned EnumDefinition::GetAlignment() +unsigned EnumDefinition::GetAlignment() const { return m_parent_type->GetAlignment(); } -bool EnumDefinition::GetForceAlignment() +bool EnumDefinition::GetForceAlignment() const { return m_parent_type->GetForceAlignment(); } -unsigned EnumDefinition::GetSize() +unsigned EnumDefinition::GetSize() const { return m_parent_type->GetSize(); } diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/EnumDefinition.h b/src/ZoneCodeGeneratorLib/Domain/Definition/EnumDefinition.h index 79b60e6f..f7104a10 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/EnumDefinition.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/EnumDefinition.h @@ -16,9 +16,9 @@ public: EnumDefinition(std::string _namespace, std::string name, const BaseTypeDefinition* parentType); _NODISCARD DataDefinitionType GetType() const override; - _NODISCARD unsigned GetAlignment() override; - _NODISCARD bool GetForceAlignment() override; - _NODISCARD unsigned GetSize() override; + _NODISCARD unsigned GetAlignment() const override; + _NODISCARD bool GetForceAlignment() const override; + _NODISCARD unsigned GetSize() const override; void AddEnumMember(EnumMember enumMember); }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.cpp b/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.cpp index b508367a..c5e472a7 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.cpp +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.cpp @@ -12,17 +12,17 @@ DataDefinitionType ForwardDeclaration::GetType() const return DataDefinitionType::FORWARD_DECLARATION; } -unsigned ForwardDeclaration::GetAlignment() +unsigned ForwardDeclaration::GetAlignment() const { return 0; } -bool ForwardDeclaration::GetForceAlignment() +bool ForwardDeclaration::GetForceAlignment() const { return false; } -unsigned ForwardDeclaration::GetSize() +unsigned ForwardDeclaration::GetSize() const { return 0; } diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.h b/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.h index 149f53fb..a7b221fa 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.h @@ -11,7 +11,7 @@ public: ForwardDeclaration(std::string _namespace, std::string name, DataDefinitionType type); _NODISCARD DataDefinitionType GetType() const override; - _NODISCARD unsigned GetAlignment() override; - _NODISCARD bool GetForceAlignment() override; - _NODISCARD unsigned GetSize() override; + _NODISCARD unsigned GetAlignment() const override; + _NODISCARD bool GetForceAlignment() const override; + _NODISCARD unsigned GetSize() const override; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/StructDefinition.cpp b/src/ZoneCodeGeneratorLib/Domain/Definition/StructDefinition.cpp index ed084258..43691118 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/StructDefinition.cpp +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/StructDefinition.cpp @@ -2,41 +2,41 @@ #include "Utils/AlignmentUtils.h" -void StructDefinition::CalculateSize() -{ - m_size = 0; - auto currentBitOffset = 0u; - - for(const auto& member : m_members) - { - if(member->m_type_declaration->m_has_custom_bit_size) - { - currentBitOffset += member->m_type_declaration->m_custom_bit_size; - } - else - { - if (currentBitOffset > 0) - { - currentBitOffset = AlignmentUtils::Align(currentBitOffset, 8u); - m_size += currentBitOffset / 8; - currentBitOffset = 0; - } - - m_size = AlignmentUtils::Align(m_size, member->GetForceAlignment() ? member->GetAlignment() : std::min(member->GetAlignment(), m_pack)); - m_size += member->m_type_declaration->GetSize(); - } - } - - if (currentBitOffset > 0) - { - currentBitOffset = AlignmentUtils::Align(currentBitOffset, 8u); - m_size += currentBitOffset / 8; - } - - m_size = AlignmentUtils::Align(m_size, GetAlignment()); - - m_flags |= FLAG_SIZE_CALCULATED; -} +//void StructDefinition::CalculateSize() +//{ +// m_size = 0; +// auto currentBitOffset = 0u; +// +// for(const auto& member : m_members) +// { +// if(member->m_type_declaration->m_has_custom_bit_size) +// { +// currentBitOffset += member->m_type_declaration->m_custom_bit_size; +// } +// else +// { +// if (currentBitOffset > 0) +// { +// currentBitOffset = AlignmentUtils::Align(currentBitOffset, 8u); +// m_size += currentBitOffset / 8; +// currentBitOffset = 0; +// } +// +// m_size = AlignmentUtils::Align(m_size, member->GetForceAlignment() ? member->GetAlignment() : std::min(member->GetAlignment(), m_pack)); +// m_size += member->m_type_declaration->GetSize(); +// } +// } +// +// if (currentBitOffset > 0) +// { +// currentBitOffset = AlignmentUtils::Align(currentBitOffset, 8u); +// m_size += currentBitOffset / 8; +// } +// +// m_size = AlignmentUtils::Align(m_size, GetAlignment()); +// +// m_flags |= FLAG_SIZE_CALCULATED; +//} StructDefinition::StructDefinition(std::string _namespace, std::string name, const int pack) : DefinitionWithMembers(std::move(_namespace), std::move(name), pack) diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/StructDefinition.h b/src/ZoneCodeGeneratorLib/Domain/Definition/StructDefinition.h index b0963c39..45f00807 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/StructDefinition.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/StructDefinition.h @@ -4,8 +4,8 @@ class StructDefinition final : public DefinitionWithMembers { -protected: - void CalculateSize() override; +//protected: +// void CalculateSize() override; public: StructDefinition(std::string _namespace, std::string name, int pack); diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/TypedefDefinition.cpp b/src/ZoneCodeGeneratorLib/Domain/Definition/TypedefDefinition.cpp index eb740a79..916082ec 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/TypedefDefinition.cpp +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/TypedefDefinition.cpp @@ -13,7 +13,7 @@ DataDefinitionType TypedefDefinition::GetType() const return DataDefinitionType::TYPEDEF; } -unsigned TypedefDefinition::GetAlignment() +unsigned TypedefDefinition::GetAlignment() const { if (m_has_alignment_override) { @@ -22,12 +22,12 @@ unsigned TypedefDefinition::GetAlignment() return m_type_declaration->GetAlignment(); } -bool TypedefDefinition::GetForceAlignment() +bool TypedefDefinition::GetForceAlignment() const { return m_has_alignment_override || m_type_declaration->GetForceAlignment(); } -unsigned TypedefDefinition::GetSize() +unsigned TypedefDefinition::GetSize() const { return m_type_declaration->GetSize(); } diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/TypedefDefinition.h b/src/ZoneCodeGeneratorLib/Domain/Definition/TypedefDefinition.h index 08d8cc35..036fbd02 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/TypedefDefinition.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/TypedefDefinition.h @@ -13,7 +13,7 @@ public: TypedefDefinition(std::string _namespace, std::string name, std::unique_ptr typeDeclaration); _NODISCARD DataDefinitionType GetType() const override; - _NODISCARD unsigned GetAlignment() override; - _NODISCARD bool GetForceAlignment() override; - _NODISCARD unsigned GetSize() override; + _NODISCARD unsigned GetAlignment() const override; + _NODISCARD bool GetForceAlignment() const override; + _NODISCARD unsigned GetSize() const override; }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/UnionDefinition.cpp b/src/ZoneCodeGeneratorLib/Domain/Definition/UnionDefinition.cpp index a7562c97..ecd039f9 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/UnionDefinition.cpp +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/UnionDefinition.cpp @@ -2,21 +2,21 @@ #include "Utils/AlignmentUtils.h" -void UnionDefinition::CalculateSize() -{ - m_size = 0; - - for(const auto& member : m_members) - { - const auto memberSize = member->m_type_declaration->GetSize(); - if (memberSize > m_size) - m_size = memberSize; - } - - m_size = AlignmentUtils::Align(m_size, GetAlignment()); - - m_flags |= FLAG_SIZE_CALCULATED; -} +//void UnionDefinition::CalculateSize() +//{ +// m_size = 0; +// +// for(const auto& member : m_members) +// { +// const auto memberSize = member->m_type_declaration->GetSize(); +// if (memberSize > m_size) +// m_size = memberSize; +// } +// +// m_size = AlignmentUtils::Align(m_size, GetAlignment()); +// +// m_flags |= FLAG_SIZE_CALCULATED; +//} UnionDefinition::UnionDefinition(std::string _namespace, std::string name, const int pack) : DefinitionWithMembers(std::move(_namespace), std::move(name), pack) diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/UnionDefinition.h b/src/ZoneCodeGeneratorLib/Domain/Definition/UnionDefinition.h index 486ae29f..e841ad79 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/UnionDefinition.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/UnionDefinition.h @@ -4,8 +4,8 @@ class UnionDefinition final : public DefinitionWithMembers { -protected: - void CalculateSize() override; +//protected: +// void CalculateSize() override; public: UnionDefinition(std::string _namespace, std::string name, int pack); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsCommonMatchers.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsCommonMatchers.cpp index 3c42a878..72f5d9e6 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsCommonMatchers.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Matcher/CommandsCommonMatchers.cpp @@ -33,7 +33,7 @@ std::unique_ptr CommandsCommonMatchers::Typen }).Transform([](CommandsMatcherFactory::token_list_t& values) { std::ostringstream str; - auto first = false; + auto first = true; for (const auto& token : values) { diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.cpp index 1da228ed..2a1ec68c 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.cpp @@ -3,9 +3,17 @@ #include "Parsing/Header/Sequence/SequenceCloseBlock.h" #include "Parsing/Header/Sequence/SequenceEnumMember.h" +HeaderBlockEnum::HeaderBlockEnum(std::string typeName, const BaseTypeDefinition* parentType, const bool isTypeDef) + : m_type_name(std::move(typeName)), + m_parent_type(parentType), + m_is_typedef(isTypeDef), + m_enum_definition(nullptr) +{ +} + HeaderBlockType HeaderBlockEnum::GetType() { - return HeaderBlockType::UNION; + return HeaderBlockType::ENUM; } const std::vector& HeaderBlockEnum::GetTestsForBlock() @@ -20,17 +28,53 @@ const std::vector& HeaderBlockEnum::GetTestsForBlock( void HeaderBlockEnum::OnOpen(HeaderParserState* state) { + m_namespace = state->m_namespace.ToString(); + + if (!m_type_name.empty()) + state->m_namespace.Push(m_type_name); } void HeaderBlockEnum::OnClose(HeaderParserState* state) { + if (!m_type_name.empty()) + state->m_namespace.Pop(); + + auto enumDefinition = std::make_unique(m_namespace, m_type_name, m_parent_type); + m_enum_definition = enumDefinition.get(); + for (auto& member : m_members) + enumDefinition->m_members.emplace_back(std::move(member)); + + state->AddDataType(std::move(enumDefinition)); + + if (m_is_typedef) + state->AddDataType(std::make_unique(m_namespace, m_variable_name, std::make_unique(m_enum_definition))); } void HeaderBlockEnum::OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) { } -void HeaderBlockEnum::SetVariableName(std::string name) +void HeaderBlockEnum::AddEnumMember(std::unique_ptr enumMember) +{ + m_members.emplace_back(std::move(enumMember)); +} + +void HeaderBlockEnum::SetBlockName(const TokenPos& nameTokenPos, std::string name) { m_variable_name = std::move(name); } + +bool HeaderBlockEnum::IsDefiningVariable() +{ + return !m_is_typedef && !m_variable_name.empty(); +} + +DataDefinition* HeaderBlockEnum::GetVariableType() +{ + return m_enum_definition; +} + +std::string HeaderBlockEnum::GetVariableName() +{ + return m_variable_name; +} diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.h index 378bdb7b..a706d60c 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.h @@ -1,18 +1,35 @@ #pragma once #include "IHeaderBlock.h" +#include "IHeaderBlockNameHolder.h" #include "IHeaderBlockVariableDefining.h" +#include "Domain/Definition/BaseTypeDefinition.h" +#include "Domain/Definition/EnumDefinition.h" -class HeaderBlockEnum final : public IHeaderBlock, public IHeaderBlockVariableDefining +class HeaderBlockEnum final : public IHeaderBlock, public IHeaderBlockNameHolder, public IHeaderBlockVariableDefining { + std::string m_namespace; + std::string m_type_name; + const BaseTypeDefinition* m_parent_type; + bool m_is_typedef; + std::vector> m_members; + EnumDefinition* m_enum_definition; + std::string m_variable_name; public: + HeaderBlockEnum(std::string typeName, const BaseTypeDefinition* parentType, bool isTypeDef); + HeaderBlockType GetType() override; const std::vector& GetTestsForBlock() override; void OnOpen(HeaderParserState* state) override; void OnClose(HeaderParserState* state) override; void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override; - void SetVariableName(std::string name) override; + void AddEnumMember(std::unique_ptr enumMember); + + void SetBlockName(const TokenPos& nameTokenPos, std::string name) override; + bool IsDefiningVariable() override; + DataDefinition* GetVariableType() override; + std::string GetVariableName() override; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.cpp index a41ec287..e5668cbe 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.cpp @@ -36,7 +36,7 @@ void HeaderBlockStruct::OnChildBlockClose(HeaderParserState* state, IHeaderBlock { } -void HeaderBlockStruct::SetVariableName(std::string name) +void HeaderBlockStruct::SetBlockName(const TokenPos& nameTokenPos, std::string name) { m_variable_name = std::move(name); -} \ No newline at end of file +} diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.h index 9c9d1349..d9487759 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.h @@ -1,9 +1,9 @@ #pragma once #include "IHeaderBlock.h" -#include "IHeaderBlockVariableDefining.h" +#include "IHeaderBlockNameHolder.h" -class HeaderBlockStruct final : public IHeaderBlock, public IHeaderBlockVariableDefining +class HeaderBlockStruct final : public IHeaderBlock, public IHeaderBlockNameHolder { std::string m_variable_name; @@ -13,6 +13,6 @@ public: void OnOpen(HeaderParserState* state) override; void OnClose(HeaderParserState* state) override; void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override; - - void SetVariableName(std::string name) override; + + void SetBlockName(const TokenPos& nameTokenPos, std::string name) override; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.cpp index b70a88c1..99fedd04 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.cpp @@ -36,7 +36,7 @@ void HeaderBlockUnion::OnChildBlockClose(HeaderParserState* state, IHeaderBlock* { } -void HeaderBlockUnion::SetVariableName(std::string name) +void HeaderBlockUnion::SetBlockName(const TokenPos& nameTokenPos, std::string name) { m_variable_name = std::move(name); } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.h index dc83c1a8..ab6dc86f 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.h @@ -1,9 +1,9 @@ #pragma once #include "IHeaderBlock.h" -#include "IHeaderBlockVariableDefining.h" +#include "IHeaderBlockNameHolder.h" -class HeaderBlockUnion final : public IHeaderBlock, public IHeaderBlockVariableDefining +class HeaderBlockUnion final : public IHeaderBlock, public IHeaderBlockNameHolder { std::string m_variable_name; @@ -13,6 +13,6 @@ public: void OnOpen(HeaderParserState* state) override; void OnClose(HeaderParserState* state) override; void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override; - - void SetVariableName(std::string name) override; + + void SetBlockName(const TokenPos& nameTokenPos, std::string name) override; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/IHeaderBlockNameHolder.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/IHeaderBlockNameHolder.h new file mode 100644 index 00000000..4dbd5e9c --- /dev/null +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/IHeaderBlockNameHolder.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +class IHeaderBlockNameHolder +{ +public: + IHeaderBlockNameHolder() = default; + virtual ~IHeaderBlockNameHolder() = default; + IHeaderBlockNameHolder(const IHeaderBlockNameHolder& other) = default; + IHeaderBlockNameHolder(IHeaderBlockNameHolder&& other) noexcept = default; + IHeaderBlockNameHolder& operator=(const IHeaderBlockNameHolder& other) = default; + IHeaderBlockNameHolder& operator=(IHeaderBlockNameHolder&& other) noexcept = default; + + virtual void SetBlockName(const TokenPos& nameTokenPos, std::string name) = 0; +}; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/IHeaderBlockVariableDefining.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/IHeaderBlockVariableDefining.h index f727af73..23b7cb83 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/IHeaderBlockVariableDefining.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/IHeaderBlockVariableDefining.h @@ -2,6 +2,8 @@ #include +#include "Domain/Definition/DataDefinition.h" + class IHeaderBlockVariableDefining { public: @@ -12,5 +14,7 @@ public: IHeaderBlockVariableDefining& operator=(const IHeaderBlockVariableDefining& other) = default; IHeaderBlockVariableDefining& operator=(IHeaderBlockVariableDefining&& other) noexcept = default; - virtual void SetVariableName(std::string name) = 0; + virtual bool IsDefiningVariable() = 0; + virtual DataDefinition* GetVariableType() = 0; + virtual std::string GetVariableName() = 0; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp index 17e19afe..988898a8 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/HeaderFileReader.cpp @@ -61,10 +61,12 @@ bool HeaderFileReader::ReadHeaderFile(IDataRepository* repository) SetupStreamProxies(); const auto lexer = std::make_unique(m_stream); - const auto parser = std::make_unique(lexer.get(), repository); + const auto parser = std::make_unique(lexer.get()); const auto start = std::chrono::steady_clock::now(); const auto result = parser->Parse(); + if (result) + parser->SaveToRepository(repository); const auto end = std::chrono::steady_clock::now(); std::cout << "Processing header took " << std::chrono::duration_cast(end - start).count() << "ms" << std::endl; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.cpp index 21711762..f469b52b 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.cpp @@ -2,9 +2,8 @@ #include "Parsing/Header/Sequence/SequenceNamespace.h" -HeaderParser::HeaderParser(HeaderLexer* lexer, IDataRepository* targetRepository) - : AbstractParser(lexer, std::make_unique()), - m_repository(targetRepository) +HeaderParser::HeaderParser(HeaderLexer* lexer) + : AbstractParser(lexer, std::make_unique()) { auto sequenceNamespace = std::make_unique(); } @@ -13,3 +12,8 @@ const std::vector& HeaderParser::GetTestsForState() { return m_state->GetBlock()->GetTestsForBlock(); } + +void HeaderParser::SaveToRepository(IDataRepository* repository) +{ + +} diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.h index 6ae208c6..c06bf75f 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParser.h @@ -7,11 +7,11 @@ class HeaderParser final : public AbstractParser { - IDataRepository* m_repository; - protected: const std::vector& GetTestsForState() override; public: - HeaderParser(HeaderLexer* lexer, IDataRepository* targetRepository); + explicit HeaderParser(HeaderLexer* lexer); + + void SaveToRepository(IDataRepository* repository); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.cpp index 546e4485..b395be0a 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.cpp @@ -1,10 +1,19 @@ #include "HeaderParserState.h" +#include "Domain/Definition/EnumDefinition.h" #include "Parsing/Header/Block/HeaderBlockNone.h" HeaderParserState::HeaderParserState() { m_blocks.push(std::make_unique()); + + for(auto i = 0u; i < BaseTypeDefinition::ALL_BASE_TYPES_COUNT; i++) + AddBaseDataType(BaseTypeDefinition::ALL_BASE_TYPES[i]); +} + +void HeaderParserState::AddBaseDataType(const BaseTypeDefinition* baseType) +{ + m_definitions.insert(std::make_pair(baseType->GetFullName(), baseType)); } IHeaderBlock* HeaderParserState::GetBlock() const @@ -29,3 +38,48 @@ void HeaderParserState::PopBlock() m_blocks.top()->OnChildBlockClose(this, poppedBlock.get()); } } + +void HeaderParserState::AddDataType(std::unique_ptr definition) +{ + if(definition->GetType() == DataDefinitionType::ENUM) + { + for(const auto& enumMember : dynamic_cast(definition.get())->m_members) + { + m_enum_members.insert(std::make_pair(enumMember->m_name, enumMember.get())); + } + } + + const DataDefinition* dataDefinition = definition.get(); + m_header_definitions.emplace_back(std::move(definition)); + m_definitions.insert(std::make_pair(dataDefinition->m_name, dataDefinition)); +} + +void HeaderParserState::AddForwardDeclaration(std::unique_ptr forwardDeclaration) +{ + m_forward_declarations.insert(std::make_pair(forwardDeclaration->m_name, std::move(forwardDeclaration))); +} + +const DataDefinition* HeaderParserState::FindType(const std::string& typeName) +{ + const auto foundDefinitionEntry = m_definitions.find(typeName); + + if (foundDefinitionEntry != m_definitions.end()) + return foundDefinitionEntry->second; + + const auto foundForwardEntry = m_forward_declarations.find(typeName); + + if (foundForwardEntry != m_forward_declarations.end()) + return foundForwardEntry->second.get(); + + return nullptr; +} + +EnumMember* HeaderParserState::FindEnumMember(const std::string& enumMemberName) +{ + const auto foundEntry = m_enum_members.find(enumMemberName); + + if (foundEntry != m_enum_members.end()) + return foundEntry->second; + + return nullptr; +} diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.h index 3c353a88..d944d2b3 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.h @@ -2,15 +2,28 @@ #include #include +#include #include "Utils/ClassUtils.h" +#include "Domain/Definition/BaseTypeDefinition.h" +#include "Domain/Definition/DataDefinition.h" +#include "Domain/Definition/EnumMember.h" +#include "Domain/Definition/ForwardDeclaration.h" #include "Utils/NamespaceBuilder.h" #include "Parsing/Header/Block/IHeaderBlock.h" class IHeaderBlock; + class HeaderParserState { + std::vector> m_header_definitions; + std::stack> m_blocks; + std::unordered_map m_definitions; + std::unordered_map m_enum_members; + std::unordered_map> m_forward_declarations; + + void AddBaseDataType(const BaseTypeDefinition* baseType); public: NamespaceBuilder m_namespace; @@ -20,4 +33,10 @@ public: _NODISCARD IHeaderBlock* GetBlock() const; void PushBlock(std::unique_ptr block); void PopBlock(); + + void AddDataType(std::unique_ptr definition); + void AddForwardDeclaration(std::unique_ptr forwardDeclaration); + + const DataDefinition* FindType(const std::string& typeName); + EnumMember* FindEnumMember(const std::string& enumMemberName); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Matcher/HeaderCommonMatchers.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Matcher/HeaderCommonMatchers.cpp index 538f3762..ba056954 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Matcher/HeaderCommonMatchers.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Matcher/HeaderCommonMatchers.cpp @@ -71,7 +71,7 @@ std::unique_ptr HeaderCommonMatchers::Typename( }).Transform([](HeaderMatcherFactory::token_list_t& values) { std::ostringstream str; - auto first = false; + auto first = true; for(const auto& token : values) { diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceCloseBlock.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceCloseBlock.cpp index 789fd50d..84718444 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceCloseBlock.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceCloseBlock.cpp @@ -1,6 +1,6 @@ #include "SequenceCloseBlock.h" -#include "Parsing/Header/Block/IHeaderBlockVariableDefining.h" +#include "Parsing/Header/Block/IHeaderBlockNameHolder.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h" #include "Parsing/Header/Matcher/HeaderCommonMatchers.h" @@ -22,7 +22,7 @@ void SequenceCloseBlock::ProcessMatch(HeaderParserState* state, SequenceResult(state->GetBlock()); + auto* variableDefiningBlock = dynamic_cast(state->GetBlock()); const auto& name = result.NextCapture(CAPTURE_NAME); if (variableDefiningBlock == nullptr) throw ParsingException(name.GetPos(), "Block does not support holding names."); - variableDefiningBlock->SetVariableName(name.IdentifierValue()); + variableDefiningBlock->SetBlockName(name.GetPos(), name.IdentifierValue()); } state->PopBlock(); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnum.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnum.cpp index 91ffd506..1aae2a6f 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnum.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnum.cpp @@ -23,5 +23,27 @@ SequenceEnum::SequenceEnum() void SequenceEnum::ProcessMatch(HeaderParserState* state, SequenceResult& result) const { - state->PushBlock(std::make_unique()); + auto isTypedef = result.PeekAndRemoveIfTag(TAG_TYPEDEF) == TAG_TYPEDEF; + std::string name; + const auto* parentType = BaseTypeDefinition::INT; + + if (result.HasNextCapture(CAPTURE_NAME)) + name = result.NextCapture(CAPTURE_NAME).IdentifierValue(); + + if(result.HasNextCapture(CAPTURE_PARENT_TYPE)) + { + const auto& typeNameToken = result.NextCapture(CAPTURE_PARENT_TYPE); + const auto* foundTypeDefinition = state->FindType(typeNameToken.TypeNameValue()); + + if (foundTypeDefinition == nullptr) + throw ParsingException(typeNameToken.GetPos(), "Cannot find type"); + + while (foundTypeDefinition->GetType() == DataDefinitionType::TYPEDEF) + foundTypeDefinition = dynamic_cast(foundTypeDefinition)->m_type_declaration->m_type; + + if (foundTypeDefinition->GetType() != DataDefinitionType::BASE_TYPE) + throw ParsingException(typeNameToken.GetPos(), "Enums can only have base types as parent type"); + } + + state->PushBlock(std::make_unique(name, parentType, isTypedef)); } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Sequence/SequenceResult.h b/src/ZoneCodeGeneratorLib/Parsing/Sequence/SequenceResult.h index c2f4d327..8c7ae076 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Sequence/SequenceResult.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Sequence/SequenceResult.h @@ -52,6 +52,21 @@ public: return AbstractMatcher::NO_ID; } + int PeekAndRemoveIfTag(const int tag) + { + if (m_tag_offset < m_tags.size()) + { + const auto result = m_tags[m_tag_offset]; + + if (result == tag) + m_tag_offset++; + + return result; + } + + return AbstractMatcher::NO_ID; + } + int NextTag() { if (m_tag_offset < m_tags.size()) diff --git a/src/ZoneCodeGeneratorLib/Utils/NamespaceBuilder.cpp b/src/ZoneCodeGeneratorLib/Utils/NamespaceBuilder.cpp index 91028f38..211daba0 100644 --- a/src/ZoneCodeGeneratorLib/Utils/NamespaceBuilder.cpp +++ b/src/ZoneCodeGeneratorLib/Utils/NamespaceBuilder.cpp @@ -4,6 +4,9 @@ std::string NamespaceBuilder::Combine(const std::string& _namespace, const std::string& name) { + if (_namespace.empty()) + return name; + std::ostringstream str; str << _namespace << "::" << name;