diff --git a/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.h b/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.h index fdac3813..2c876787 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.h +++ b/src/ZoneCodeGeneratorLib/Domain/Information/MemberInformation.h @@ -20,7 +20,7 @@ public: bool m_is_reusable; bool m_is_leaf; std::unique_ptr m_condition; - FastFileBlock* m_fast_file_block; + const FastFileBlock* m_fast_file_block; MemberInformation(StructureInformation* parent, StructureInformation* type, Variable* member); }; diff --git a/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h b/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h index dd998d4b..4a463124 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h +++ b/src/ZoneCodeGeneratorLib/Domain/Information/StructureInformation.h @@ -29,7 +29,7 @@ public: bool m_reference_from_non_default_normal_block_exists; std::unique_ptr m_post_load_action; - FastFileBlock* m_block; + const FastFileBlock* m_block; std::vector m_name_chain; explicit StructureInformation(DefinitionWithMembers* definition); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceSetBlock.cpp b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceSetBlock.cpp index 1830df07..d24c2aa5 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceSetBlock.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceSetBlock.cpp @@ -9,7 +9,7 @@ SequenceSetBlock::SequenceSetBlock() AddLabeledMatchers(CommandsCommonMatchers::Typename(this), CommandsCommonMatchers::LABEL_TYPENAME); AddMatchers({ - create.Keyword("set"), + create.Keyword("set").Capture(CAPTURE_START), create.Keyword("block"), create.Or({ create.And({ @@ -24,4 +24,29 @@ SequenceSetBlock::SequenceSetBlock() void SequenceSetBlock::ProcessMatch(CommandsParserState* state, SequenceResult& result) const { + StructureInformation* information; + std::vector memberChain; + + if (result.HasNextCapture(CAPTURE_TYPE)) + { + const auto& typeNameToken = result.NextCapture(CAPTURE_TYPE); + if (!state->GetTypenameAndMembersFromTypename(typeNameToken.TypeNameValue(), information, memberChain)) + throw ParsingException(typeNameToken.GetPos(), "Unknown type"); + } + else if (state->GetInUse() != nullptr) + { + information = state->GetInUse(); + } + else + throw ParsingException(result.NextCapture(CAPTURE_START).GetPos(), "No type is used. Therefore one needs to be specified directly."); + + const auto& blockNameToken = result.NextCapture(CAPTURE_BLOCK_ENUM_ENTRY); + auto* fastFileBlock = state->GetRepository()->GetFastFileBlockByName(blockNameToken.IdentifierValue()); + if (fastFileBlock == nullptr) + throw ParsingException(blockNameToken.GetPos(), "Unknown block"); + + if (!memberChain.empty()) + memberChain.back()->m_fast_file_block = fastFileBlock; + else + information->m_block = fastFileBlock; } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceSetBlock.h b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceSetBlock.h index 684337fe..ee06cc88 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceSetBlock.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Commands/Sequence/SequenceSetBlock.h @@ -4,8 +4,9 @@ class SequenceSetBlock final : public CommandsParser::sequence_t { - static constexpr auto CAPTURE_TYPE = 1; - static constexpr auto CAPTURE_BLOCK_ENUM_ENTRY = 2; + static constexpr auto CAPTURE_START = 1; + static constexpr auto CAPTURE_TYPE = 2; + static constexpr auto CAPTURE_BLOCK_ENUM_ENTRY = 3; protected: void ProcessMatch(CommandsParserState* state, SequenceResult& result) const override; diff --git a/src/ZoneCodeGeneratorLib/Persistence/IDataRepository.h b/src/ZoneCodeGeneratorLib/Persistence/IDataRepository.h index 796af7bd..2cfd1c5a 100644 --- a/src/ZoneCodeGeneratorLib/Persistence/IDataRepository.h +++ b/src/ZoneCodeGeneratorLib/Persistence/IDataRepository.h @@ -43,4 +43,5 @@ public: _NODISCARD virtual DataDefinition* GetDataDefinitionByName(const std::string& name) const = 0; _NODISCARD virtual StructureInformation* GetInformationFor(const DefinitionWithMembers* definitionWithMembers) const = 0; _NODISCARD virtual EnumMember* GetEnumMemberByName(const std::string& name) const = 0; + _NODISCARD virtual FastFileBlock* GetFastFileBlockByName(const std::string& name) const = 0; }; diff --git a/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.cpp b/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.cpp index f0c242b5..0b70cdd3 100644 --- a/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.cpp +++ b/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.cpp @@ -61,7 +61,9 @@ void InMemoryRepository::Add(std::unique_ptr structureInfo void InMemoryRepository::Add(std::unique_ptr fastFileBlock) { - m_fast_file_blocks.push_back(fastFileBlock.release()); + auto* raw = fastFileBlock.release(); + m_fast_file_blocks.push_back(raw); + m_fast_file_blocks_by_name[raw->m_name] = raw; } const std::string& InMemoryRepository::GetGameName() const @@ -143,3 +145,13 @@ EnumMember* InMemoryRepository::GetEnumMemberByName(const std::string& name) con return nullptr; } + +FastFileBlock* InMemoryRepository::GetFastFileBlockByName(const std::string& name) const +{ + const auto foundEntry = m_fast_file_blocks_by_name.find(name); + + if (foundEntry != m_fast_file_blocks_by_name.end()) + return foundEntry->second; + + return nullptr; +} diff --git a/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.h b/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.h index be76f93b..389fab37 100644 --- a/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.h +++ b/src/ZoneCodeGeneratorLib/Persistence/InMemory/InMemoryRepository.h @@ -14,6 +14,7 @@ class InMemoryRepository final : public IDataRepository std::vector m_fast_file_blocks; std::map m_data_definitions_by_name; std::map m_enum_members_by_name; + std::map m_fast_file_blocks_by_name; std::map m_structure_information_by_definition; std::string m_game_name; Architecture m_architecture; @@ -35,7 +36,7 @@ public: _NODISCARD const std::string& GetGameName() const override; void SetGame(std::string gameName) override; - Architecture GetArchitecture() const override; + _NODISCARD Architecture GetArchitecture() const override; void SetArchitecture(Architecture architecture) override; _NODISCARD const std::vector& GetAllEnums() const override; @@ -48,4 +49,5 @@ public: _NODISCARD DataDefinition* GetDataDefinitionByName(const std::string& name) const override; _NODISCARD StructureInformation* GetInformationFor(const DefinitionWithMembers* definitionWithMembers) const override; _NODISCARD EnumMember* GetEnumMemberByName(const std::string& name) const override; + _NODISCARD FastFileBlock* GetFastFileBlockByName(const std::string& name) const override; };