Skip to content

Commit

Permalink
Support comma in brackets and braces in preprocessor args
Browse files Browse the repository at this point in the history
  • Loading branch information
Laupetin committed Dec 24, 2023
1 parent 067f1a8 commit 4ba33f0
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 3 deletions.
19 changes: 16 additions & 3 deletions src/Parser/Parsing/Impl/DefinesStreamProxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -510,10 +510,10 @@ void DefinesStreamProxy::ContinueMacroParameters(const ParserLine& line, unsigne
m_macro_parameter_state = ParameterState::AFTER_COMMA;
}
}
else if (c == '(')
else if (c == '(' || c == '[' || c == '{')
{
m_macro_parameter_state = ParameterState::AFTER_PARAM;
m_macro_bracket_depth.push('(');
m_macro_bracket_depth.push(c);
m_current_macro_parameter << c;
}
else if (c == ')')
Expand All @@ -523,8 +523,8 @@ void DefinesStreamProxy::ContinueMacroParameters(const ParserLine& line, unsigne
if (m_macro_bracket_depth.top() != '(')
throw ParsingException(CreatePos(line, pos), "Unbalanced brackets in macro parameters");

m_macro_parameter_state = ParameterState::AFTER_PARAM;
m_macro_bracket_depth.pop();
m_macro_parameter_state = ParameterState::AFTER_PARAM;
m_current_macro_parameter << c;
}
else if (m_macro_parameter_state == ParameterState::AFTER_COMMA)
Expand All @@ -537,6 +537,19 @@ void DefinesStreamProxy::ContinueMacroParameters(const ParserLine& line, unsigne
m_macro_parameter_state = ParameterState::NOT_IN_PARAMETERS;
}
}
else if (c == ']' || c == '}')
{
if (!m_macro_bracket_depth.empty())
{
const auto otherBracket = c == ']' ? '[' : '{';
if (m_macro_bracket_depth.top() != otherBracket)
throw ParsingException(CreatePos(line, pos), "Unbalanced brackets in macro parameters");
m_macro_bracket_depth.pop();
}

m_macro_parameter_state = ParameterState::AFTER_PARAM;
m_current_macro_parameter << c;
}
else if (m_macro_parameter_state == ParameterState::AFTER_PARAM || !isspace(c))
{
m_macro_parameter_state = ParameterState::AFTER_PARAM;
Expand Down
38 changes: 38 additions & 0 deletions test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -729,6 +729,44 @@ namespace test::parsing::impl::defines_stream_proxy
REQUIRE(proxy.Eof());
}

TEST_CASE("DefinesStreamProxy: Ensure throws error on unclosed parenthesis in params", "[parsing][parsingstream]")
{
const std::vector<std::string> lines{
"#define someStuff(param1) Hello param1 World",
"someStuff(A sentence with [brackets and a , character and stuff)",
"someStuff(A sentence with {braces and a , character and stuff)",
};

MockParserLineStream mockStream(lines);
DefinesStreamProxy proxy(&mockStream);

ExpectLine(&proxy, 1, "");
ExpectErrorInLine(&proxy, 2, 64);
ExpectErrorInLine(&proxy, 3, 62);

REQUIRE(proxy.Eof());
}

TEST_CASE("DefinesStreamProxy: Ensure throws error on parenthesis in params closed with wrong equivalent", "[parsing][parsingstream]")
{
const std::vector<std::string> lines{
"#define someStuff(param1) Hello param1 World",
"someStuff(A sentence with (parenthesis and a , character] and stuff)",
"someStuff(A sentence with [brackets and a , character} and stuff)",
"someStuff(A sentence with {braces and a , character) and stuff)",
};

MockParserLineStream mockStream(lines);
DefinesStreamProxy proxy(&mockStream);

ExpectLine(&proxy, 1, "");
ExpectErrorInLine(&proxy, 2, 57);
ExpectErrorInLine(&proxy, 3, 54);
ExpectErrorInLine(&proxy, 4, 52);

REQUIRE(proxy.Eof());
}

TEST_CASE("DefinesStreamProxy: Ensure defines can go over multiple lines", "[parsing][parsingstream]")
{
const std::vector<std::string> lines{
Expand Down

0 comments on commit 4ba33f0

Please sign in to comment.