Parse enum members

This commit is contained in:
Jan 2021-02-18 18:10:49 +01:00
parent 5d5fc86923
commit 031d851c43
3 changed files with 52 additions and 0 deletions

View File

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

View File

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

View File

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