2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2025-07-01 16:51:56 +00:00

create enum definitions from headers

This commit is contained in:
Jan
2021-02-18 17:15:46 +01:00
parent 3c1599c1a0
commit 5d5fc86923
34 changed files with 350 additions and 163 deletions

View File

@ -2,9 +2,8 @@
#include "Parsing/Header/Sequence/SequenceNamespace.h"
HeaderParser::HeaderParser(HeaderLexer* lexer, IDataRepository* targetRepository)
: AbstractParser(lexer, std::make_unique<HeaderParserState>()),
m_repository(targetRepository)
HeaderParser::HeaderParser(HeaderLexer* lexer)
: AbstractParser(lexer, std::make_unique<HeaderParserState>())
{
auto sequenceNamespace = std::make_unique<SequenceNamespace>();
}
@ -13,3 +12,8 @@ const std::vector<HeaderParser::sequence_t*>& HeaderParser::GetTestsForState()
{
return m_state->GetBlock()->GetTestsForBlock();
}
void HeaderParser::SaveToRepository(IDataRepository* repository)
{
}

View File

@ -7,11 +7,11 @@
class HeaderParser final : public AbstractParser<HeaderParserValue, HeaderParserState>
{
IDataRepository* m_repository;
protected:
const std::vector<sequence_t*>& GetTestsForState() override;
public:
HeaderParser(HeaderLexer* lexer, IDataRepository* targetRepository);
explicit HeaderParser(HeaderLexer* lexer);
void SaveToRepository(IDataRepository* repository);
};

View File

@ -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<HeaderBlockNone>());
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<DataDefinition> definition)
{
if(definition->GetType() == DataDefinitionType::ENUM)
{
for(const auto& enumMember : dynamic_cast<EnumDefinition*>(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> 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;
}

View File

@ -2,15 +2,28 @@
#include <memory>
#include <stack>
#include <unordered_map>
#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<std::unique_ptr<DataDefinition>> m_header_definitions;
std::stack<std::unique_ptr<IHeaderBlock>> m_blocks;
std::unordered_map<std::string, const DataDefinition*> m_definitions;
std::unordered_map<std::string, EnumMember*> m_enum_members;
std::unordered_map<std::string, std::unique_ptr<ForwardDeclaration>> 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<IHeaderBlock> block);
void PopBlock();
void AddDataType(std::unique_ptr<DataDefinition> definition);
void AddForwardDeclaration(std::unique_ptr<ForwardDeclaration> forwardDeclaration);
const DataDefinition* FindType(const std::string& typeName);
EnumMember* FindEnumMember(const std::string& enumMemberName);
};