mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-04-20 16:15:43 +00:00
Parse enum members
This commit is contained in:
parent
5d5fc86923
commit
031d851c43
@ -7,6 +7,7 @@ HeaderBlockEnum::HeaderBlockEnum(std::string typeName, const BaseTypeDefinition*
|
||||
: m_type_name(std::move(typeName)),
|
||||
m_parent_type(parentType),
|
||||
m_is_typedef(isTypeDef),
|
||||
m_next_value(0),
|
||||
m_enum_definition(nullptr)
|
||||
{
|
||||
}
|
||||
@ -56,9 +57,26 @@ void HeaderBlockEnum::OnChildBlockClose(HeaderParserState* state, IHeaderBlock*
|
||||
|
||||
void HeaderBlockEnum::AddEnumMember(std::unique_ptr<EnumMember> enumMember)
|
||||
{
|
||||
m_next_value = enumMember->m_value + 1;
|
||||
m_members.emplace_back(std::move(enumMember));
|
||||
}
|
||||
|
||||
EnumMember* HeaderBlockEnum::GetEnumMember(const std::string& name) const
|
||||
{
|
||||
for (const auto& member : m_members)
|
||||
{
|
||||
if (member->m_name == name)
|
||||
return member.get();
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
long long HeaderBlockEnum::GetNextEnumMemberValue() const
|
||||
{
|
||||
return m_next_value;
|
||||
}
|
||||
|
||||
void HeaderBlockEnum::SetBlockName(const TokenPos& nameTokenPos, std::string name)
|
||||
{
|
||||
m_variable_name = std::move(name);
|
||||
|
@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include "Utils/ClassUtils.h"
|
||||
#include "IHeaderBlock.h"
|
||||
#include "IHeaderBlockNameHolder.h"
|
||||
#include "IHeaderBlockVariableDefining.h"
|
||||
@ -13,6 +14,7 @@ class HeaderBlockEnum final : public IHeaderBlock, public IHeaderBlockNameHolder
|
||||
const BaseTypeDefinition* m_parent_type;
|
||||
bool m_is_typedef;
|
||||
std::vector<std::unique_ptr<EnumMember>> m_members;
|
||||
long long m_next_value;
|
||||
EnumDefinition* m_enum_definition;
|
||||
|
||||
std::string m_variable_name;
|
||||
@ -27,6 +29,8 @@ public:
|
||||
void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override;
|
||||
|
||||
void AddEnumMember(std::unique_ptr<EnumMember> enumMember);
|
||||
_NODISCARD EnumMember* GetEnumMember(const std::string& name) const;
|
||||
_NODISCARD long long GetNextEnumMemberValue() const;
|
||||
|
||||
void SetBlockName(const TokenPos& nameTokenPos, std::string name) override;
|
||||
bool IsDefiningVariable() override;
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "SequenceEnumMember.h"
|
||||
|
||||
#include "Parsing/Header/Block/HeaderBlockEnum.h"
|
||||
#include "Parsing/Header/Matcher/HeaderMatcherFactory.h"
|
||||
#include "Parsing/Header/Matcher/HeaderCommonMatchers.h"
|
||||
|
||||
@ -25,4 +26,33 @@ SequenceEnumMember::SequenceEnumMember()
|
||||
|
||||
void SequenceEnumMember::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const
|
||||
{
|
||||
long long value;
|
||||
auto* enumBlock = dynamic_cast<HeaderBlockEnum*>(state->GetBlock());
|
||||
|
||||
if (result.HasNextCapture(CAPTURE_VALUE))
|
||||
{
|
||||
const auto& valueToken = result.NextCapture(CAPTURE_VALUE);
|
||||
if (valueToken.m_type == HeaderParserValueType::IDENTIFIER)
|
||||
{
|
||||
auto* enumMember = enumBlock->GetEnumMember(valueToken.IdentifierValue());
|
||||
|
||||
if (enumMember == nullptr)
|
||||
enumMember = state->FindEnumMember(valueToken.IdentifierValue());
|
||||
|
||||
if (enumMember == nullptr)
|
||||
throw ParsingException(valueToken.GetPos(), "Could not find enum member with specified name");
|
||||
|
||||
value = enumMember->m_value;
|
||||
}
|
||||
else
|
||||
{
|
||||
value = valueToken.IntegerValue();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
value = enumBlock->GetNextEnumMemberValue();
|
||||
}
|
||||
|
||||
enumBlock->AddEnumMember(std::make_unique<EnumMember>(result.NextCapture(CAPTURE_NAME).IdentifierValue(), value));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user