mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-09-03 23:37:26 +00:00
Set closing block variable names
This commit is contained in:
@@ -1,14 +1,16 @@
|
||||
#include "SequenceCloseBlock.h"
|
||||
|
||||
#include "Parsing/Header/Block/IHeaderBlockVariableDefining.h"
|
||||
#include "Parsing/Header/Matcher/HeaderMatcherFactory.h"
|
||||
#include "Parsing/Header/Matcher/HeaderCommonMatchers.h"
|
||||
|
||||
SequenceCloseBlock::SequenceCloseBlock()
|
||||
SequenceCloseBlock::SequenceCloseBlock(const bool semicolonRequired)
|
||||
: m_semicolon_required(semicolonRequired)
|
||||
{
|
||||
const HeaderMatcherFactory create(this);
|
||||
|
||||
AddMatchers({
|
||||
create.Char('}'),
|
||||
create.Char('}').Capture(CAPTURE_CLOSING_PARENTHESIS),
|
||||
create.Optional(create.And({
|
||||
create.Optional(create.Identifier().Capture(CAPTURE_NAME)),
|
||||
create.Char(';').Tag(TAG_SEMICOLON)
|
||||
@@ -18,6 +20,27 @@ SequenceCloseBlock::SequenceCloseBlock()
|
||||
|
||||
void SequenceCloseBlock::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const
|
||||
{
|
||||
// TODO: Set variable name to last block
|
||||
if (result.NextTag() == TAG_SEMICOLON)
|
||||
{
|
||||
if(!m_semicolon_required)
|
||||
throw ParsingException(result.NextCapture(CAPTURE_CLOSING_PARENTHESIS).GetPos(), "Block should not be closed with semicolon");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_semicolon_required)
|
||||
throw ParsingException(result.NextCapture(CAPTURE_CLOSING_PARENTHESIS).GetPos(), "Block must be closed with semicolon");
|
||||
}
|
||||
|
||||
if (result.HasNextCapture(CAPTURE_NAME))
|
||||
{
|
||||
auto* variableDefiningBlock = dynamic_cast<IHeaderBlockVariableDefining*>(state->GetBlock());
|
||||
const auto& name = result.NextCapture(CAPTURE_NAME);
|
||||
|
||||
if (variableDefiningBlock == nullptr)
|
||||
throw ParsingException(name.GetPos(), "Block does not support holding names.");
|
||||
|
||||
variableDefiningBlock->SetVariableName(name.IdentifierValue());
|
||||
}
|
||||
|
||||
state->PopBlock();
|
||||
}
|
||||
|
@@ -10,10 +10,13 @@ class SequenceCloseBlock final : public HeaderParser::sequence_t
|
||||
static constexpr auto TAG_SEMICOLON = 1;
|
||||
|
||||
static constexpr auto CAPTURE_NAME = 1;
|
||||
static constexpr auto CAPTURE_CLOSING_PARENTHESIS = 2;
|
||||
|
||||
bool m_semicolon_required;
|
||||
|
||||
protected:
|
||||
void ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const override;
|
||||
|
||||
public:
|
||||
SequenceCloseBlock();
|
||||
explicit SequenceCloseBlock(bool semicolonRequired);
|
||||
};
|
||||
|
Reference in New Issue
Block a user