2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2025-07-01 08:41:52 +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

@ -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<IHeaderBlock::sequence_t*>& HeaderBlockEnum::GetTestsForBlock()
@ -20,17 +28,53 @@ const std::vector<IHeaderBlock::sequence_t*>& 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<EnumDefinition>(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<TypedefDefinition>(m_namespace, m_variable_name, std::make_unique<TypeDeclaration>(m_enum_definition)));
}
void HeaderBlockEnum::OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block)
{
}
void HeaderBlockEnum::SetVariableName(std::string name)
void HeaderBlockEnum::AddEnumMember(std::unique_ptr<EnumMember> 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;
}

View File

@ -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<std::unique_ptr<EnumMember>> 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<sequence_t*>& 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> enumMember);
void SetBlockName(const TokenPos& nameTokenPos, std::string name) override;
bool IsDefiningVariable() override;
DataDefinition* GetVariableType() override;
std::string GetVariableName() override;
};

View File

@ -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);
}
}

View File

@ -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;
};

View File

@ -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);
}

View File

@ -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;
};

View File

@ -0,0 +1,16 @@
#pragma once
#include <string>
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;
};

View File

@ -2,6 +2,8 @@
#include <string>
#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;
};