diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.cpp index 2b9edf0a..50e724ea 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.cpp @@ -18,14 +18,14 @@ const std::vector& HeaderBlockEnum::GetTestsForBlock( return tests; } -void HeaderBlockEnum::OnOpen() +void HeaderBlockEnum::OnOpen(HeaderParserState* state) { } -void HeaderBlockEnum::OnClose() +void HeaderBlockEnum::OnClose(HeaderParserState* state) { } -void HeaderBlockEnum::OnChildBlockClose(IHeaderBlock* block) +void HeaderBlockEnum::OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) { } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.h index ec9dd1c9..d6a0a2c2 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockEnum.h @@ -7,7 +7,7 @@ class HeaderBlockEnum final : public IHeaderBlock public: HeaderBlockType GetType() override; const std::vector& GetTestsForBlock() override; - void OnOpen() override; - void OnClose() override; - void OnChildBlockClose(IHeaderBlock* block) override; + void OnOpen(HeaderParserState* state) override; + void OnClose(HeaderParserState* state) override; + void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNamespace.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNamespace.cpp index eba5f3ea..126c8376 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNamespace.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNamespace.cpp @@ -8,6 +8,11 @@ #include "Parsing/Header/Sequence/SequenceTypedef.h" #include "Parsing/Header/Sequence/SequenceUnion.h" +HeaderBlockNamespace::HeaderBlockNamespace(std::string namespaceName) + : m_namespace_name(std::move(namespaceName)) +{ +} + HeaderBlockType HeaderBlockNamespace::GetType() { return HeaderBlockType::NAMESPACE; @@ -28,14 +33,16 @@ const std::vector& HeaderBlockNamespace::GetTestsForB return tests; } -void HeaderBlockNamespace::OnOpen() +void HeaderBlockNamespace::OnOpen(HeaderParserState* state) { + state->m_namespace.Push(m_namespace_name); } -void HeaderBlockNamespace::OnClose() +void HeaderBlockNamespace::OnClose(HeaderParserState* state) { + state->m_namespace.Pop(); } -void HeaderBlockNamespace::OnChildBlockClose(IHeaderBlock* block) +void HeaderBlockNamespace::OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) { } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNamespace.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNamespace.h index 9683d937..6f99ce5d 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNamespace.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNamespace.h @@ -4,10 +4,14 @@ class HeaderBlockNamespace final : public IHeaderBlock { + std::string m_namespace_name; + public: + explicit HeaderBlockNamespace(std::string namespaceName); + HeaderBlockType GetType() override; const std::vector& GetTestsForBlock() override; - void OnOpen() override; - void OnClose() override; - void OnChildBlockClose(IHeaderBlock* block) override; + void OnOpen(HeaderParserState* state) override; + void OnClose(HeaderParserState* state) override; + void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNone.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNone.cpp index aba0e2a9..342c5226 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNone.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNone.cpp @@ -26,14 +26,14 @@ const std::vector& HeaderBlockNone::GetTestsForBlock( return tests; } -void HeaderBlockNone::OnOpen() +void HeaderBlockNone::OnOpen(HeaderParserState* state) { } -void HeaderBlockNone::OnClose() +void HeaderBlockNone::OnClose(HeaderParserState* state) { } -void HeaderBlockNone::OnChildBlockClose(IHeaderBlock* block) +void HeaderBlockNone::OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) { } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNone.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNone.h index ad0bf7fe..76391f2b 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNone.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockNone.h @@ -7,7 +7,7 @@ class HeaderBlockNone final : public IHeaderBlock public: HeaderBlockType GetType() override; const std::vector& GetTestsForBlock() override; - void OnOpen() override; - void OnClose() override; - void OnChildBlockClose(IHeaderBlock* block) override; + void OnOpen(HeaderParserState* state) override; + void OnClose(HeaderParserState* state) override; + void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.cpp index 8a024052..c980be93 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.cpp @@ -24,14 +24,14 @@ const std::vector& HeaderBlockStruct::GetTestsForBloc return tests; } -void HeaderBlockStruct::OnOpen() +void HeaderBlockStruct::OnOpen(HeaderParserState* state) { } -void HeaderBlockStruct::OnClose() +void HeaderBlockStruct::OnClose(HeaderParserState* state) { } -void HeaderBlockStruct::OnChildBlockClose(IHeaderBlock* block) +void HeaderBlockStruct::OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) { } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.h index 933533e1..40cd549d 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockStruct.h @@ -7,7 +7,7 @@ class HeaderBlockStruct final : public IHeaderBlock public: HeaderBlockType GetType() override; const std::vector& GetTestsForBlock() override; - void OnOpen() override; - void OnClose() override; - void OnChildBlockClose(IHeaderBlock* block) override; + void OnOpen(HeaderParserState* state) override; + void OnClose(HeaderParserState* state) override; + void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.cpp index 7b8a52a8..67c01964 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.cpp @@ -24,14 +24,14 @@ const std::vector& HeaderBlockUnion::GetTestsForBlock return tests; } -void HeaderBlockUnion::OnOpen() +void HeaderBlockUnion::OnOpen(HeaderParserState* state) { } -void HeaderBlockUnion::OnClose() +void HeaderBlockUnion::OnClose(HeaderParserState* state) { } -void HeaderBlockUnion::OnChildBlockClose(IHeaderBlock* block) +void HeaderBlockUnion::OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) { } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.h index 912e85e0..d971b3fb 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/HeaderBlockUnion.h @@ -7,7 +7,7 @@ class HeaderBlockUnion final : public IHeaderBlock public: HeaderBlockType GetType() override; const std::vector& GetTestsForBlock() override; - void OnOpen() override; - void OnClose() override; - void OnChildBlockClose(IHeaderBlock* block) override; + void OnOpen(HeaderParserState* state) override; + void OnClose(HeaderParserState* state) override; + void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override; }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/IHeaderBlock.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/IHeaderBlock.h index b2f2c0af..b42286f1 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Block/IHeaderBlock.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Block/IHeaderBlock.h @@ -32,7 +32,7 @@ public: virtual const std::vector& GetTestsForBlock() = 0; - virtual void OnOpen() = 0; - virtual void OnClose() = 0; - virtual void OnChildBlockClose(IHeaderBlock* block) = 0; + virtual void OnOpen(HeaderParserState* state) = 0; + virtual void OnClose(HeaderParserState* state) = 0; + virtual void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) = 0; }; \ No newline at end of file diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.cpp index 46fa46ef..546e4485 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.cpp @@ -11,3 +11,21 @@ IHeaderBlock* HeaderParserState::GetBlock() const { return m_blocks.top().get(); } + +void HeaderParserState::PushBlock(std::unique_ptr block) +{ + m_blocks.emplace(std::move(block)); + m_blocks.top()->OnOpen(this); +} + +void HeaderParserState::PopBlock() +{ + // Leave at least one block on the stack which should be the only "none" block + if (m_blocks.size() > 1) + { + std::unique_ptr poppedBlock = std::move(m_blocks.top()); + m_blocks.pop(); + poppedBlock->OnClose(this); + m_blocks.top()->OnChildBlockClose(this, poppedBlock.get()); + } +} diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.h index bd116a20..3c353a88 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Impl/HeaderParserState.h @@ -4,6 +4,7 @@ #include #include "Utils/ClassUtils.h" +#include "Utils/NamespaceBuilder.h" #include "Parsing/Header/Block/IHeaderBlock.h" class IHeaderBlock; @@ -12,7 +13,11 @@ class HeaderParserState std::stack> m_blocks; public: + NamespaceBuilder m_namespace; + HeaderParserState(); _NODISCARD IHeaderBlock* GetBlock() const; + void PushBlock(std::unique_ptr block); + void PopBlock(); }; diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceCloseBlock.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceCloseBlock.cpp index 96213976..bcf718fd 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceCloseBlock.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceCloseBlock.cpp @@ -18,4 +18,6 @@ SequenceCloseBlock::SequenceCloseBlock() void SequenceCloseBlock::ProcessMatch(HeaderParserState* state, SequenceResult& result) const { + // TODO: Set variable name to last block + state->PopBlock(); } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnum.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnum.cpp index c59ca08b..91ffd506 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnum.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceEnum.cpp @@ -1,5 +1,6 @@ #include "SequenceEnum.h" +#include "Parsing/Header/Block/HeaderBlockEnum.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h" #include "Parsing/Header/Matcher/HeaderCommonMatchers.h" @@ -22,4 +23,5 @@ SequenceEnum::SequenceEnum() void SequenceEnum::ProcessMatch(HeaderParserState* state, SequenceResult& result) const { + state->PushBlock(std::make_unique()); } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceNamespace.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceNamespace.cpp index 8eacd68f..26129392 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceNamespace.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceNamespace.cpp @@ -1,5 +1,7 @@ #include "SequenceNamespace.h" + +#include "Parsing/Header/Block/HeaderBlockNamespace.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h" SequenceNamespace::SequenceNamespace() @@ -15,4 +17,6 @@ SequenceNamespace::SequenceNamespace() void SequenceNamespace::ProcessMatch(HeaderParserState* state, SequenceResult& result) const { + assert(result.HasNextCapture(CAPTURE_NAME)); + state->PushBlock(std::make_unique(result.NextCapture(CAPTURE_NAME).IdentifierValue())); } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceStruct.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceStruct.cpp index c3bdf9fa..fc7e0b2e 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceStruct.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceStruct.cpp @@ -1,5 +1,6 @@ #include "SequenceStruct.h" +#include "Parsing/Header/Block/HeaderBlockStruct.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h" #include "Parsing/Header/Matcher/HeaderCommonMatchers.h" @@ -25,4 +26,5 @@ SequenceStruct::SequenceStruct() void SequenceStruct::ProcessMatch(HeaderParserState* state, SequenceResult& result) const { + state->PushBlock(std::make_unique()); } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceUnion.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceUnion.cpp index d371ebd1..081de0f7 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceUnion.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceUnion.cpp @@ -1,5 +1,6 @@ #include "SequenceUnion.h" +#include "Parsing/Header/Block/HeaderBlockUnion.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h" #include "Parsing/Header/Matcher/HeaderCommonMatchers.h" @@ -25,4 +26,5 @@ SequenceUnion::SequenceUnion() void SequenceUnion::ProcessMatch(HeaderParserState* state, SequenceResult& result) const { + state->PushBlock(std::make_unique()); }