diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.h b/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.h index a7b221fa..89283ae7 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.h @@ -6,7 +6,7 @@ class ForwardDeclaration final : public DataDefinition { public: const DataDefinitionType m_forwarded_type; - DataDefinition* m_definition; + const DataDefinition* m_definition; ForwardDeclaration(std::string _namespace, std::string name, DataDefinitionType type); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.cpp index f840bb39..77dc1b60 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.cpp @@ -9,10 +9,10 @@ SequenceForwardDecl::SequenceForwardDecl() AddMatchers({ create.Or({ - create.Type(HeaderParserValueType::ENUM), - create.Type(HeaderParserValueType::STRUCT), - create.Type(HeaderParserValueType::UNION) - }), + create.Type(HeaderParserValueType::ENUM).Tag(TAG_ENUM), + create.Type(HeaderParserValueType::STRUCT).Tag(TAG_STRUCT), + create.Type(HeaderParserValueType::UNION).Tag(TAG_UNION) + }).Capture(CAPTURE_TYPE), create.Identifier().Capture(CAPTURE_NAME), create.Char(';') }); @@ -20,4 +20,26 @@ SequenceForwardDecl::SequenceForwardDecl() void SequenceForwardDecl::ProcessMatch(HeaderParserState* state, SequenceResult& result) const { + const auto typeTag = result.NextTag(); + DataDefinitionType type; + + switch(typeTag) + { + case TAG_ENUM: + type = DataDefinitionType::ENUM; + break; + + case TAG_STRUCT: + type = DataDefinitionType::STRUCT; + break; + + case TAG_UNION: + type = DataDefinitionType::UNION; + break; + + default: + throw ParsingException(result.NextCapture(CAPTURE_TYPE).GetPos(), "Unknown type"); + } + + state->AddForwardDeclaration(std::make_unique(state->m_namespace.ToString(), result.NextCapture(CAPTURE_NAME).IdentifierValue(), type)); } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.h index dffa5e17..44304de2 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.h @@ -11,7 +11,8 @@ class SequenceForwardDecl final : public HeaderParser::sequence_t static constexpr auto TAG_STRUCT = 2; static constexpr auto TAG_UNION = 3; - static constexpr auto CAPTURE_NAME = 1; + static constexpr auto CAPTURE_TYPE = 1; + static constexpr auto CAPTURE_NAME = 2; protected: void ProcessMatch(HeaderParserState* state, SequenceResult& result) const override;