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:
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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;
|
||||
};
|
@ -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;
|
||||
};
|
||||
|
Reference in New Issue
Block a user