diff --git a/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp b/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp index ff223448..0fee8d1a 100644 --- a/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp +++ b/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp @@ -7,6 +7,7 @@ #include "Parsing/Simple/SimpleExpressionInterpreter.h" #include "Utils/ClassUtils.h" +#include #include #include #include @@ -581,9 +582,11 @@ void DefinesStreamProxy::ExtractParametersFromDefineUsage(const ParserLine& line if (line.m_line[parameterStart] != '(') return; - m_macro_parameters = std::vector(); - m_macro_bracket_depth = std::stack(); m_macro_parameter_state = ParameterState::AFTER_OPEN; + m_macro_parameters = std::vector(); + m_current_macro_parameter.clear(); + m_current_macro_parameter.str(std::string()); + m_macro_bracket_depth = std::stack(); parameterEnd = parameterStart + 1; ContinueMacroParameters(line, parameterEnd); diff --git a/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp b/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp index da2d2e7e..495406b6 100644 --- a/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp +++ b/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp @@ -776,4 +776,58 @@ namespace test::parsing::impl::defines_stream_proxy REQUIRE(proxy.Eof()); } + + TEST_CASE("DefinesStreamProxy: Can use second macro after multi-line macro", "[parsing][parsingstream]") + { + const std::vector lines{ + "#define LOL HAHA", + "#define testMacro(a, b) a likes b", + "testMacro(", + "Peter,", + "Anna", + ") LOL funny", + }; + + MockParserLineStream mockStream(lines); + DefinesStreamProxy proxy(&mockStream); + + ExpectLine(&proxy, 1, ""); + ExpectLine(&proxy, 2, ""); + ExpectLine(&proxy, 3, ""); + ExpectLine(&proxy, 4, ""); + ExpectLine(&proxy, 5, ""); + ExpectLine(&proxy, 6, "Peter likes Anna HAHA funny"); + + REQUIRE(proxy.Eof()); + } + + TEST_CASE("DefinesStreamProxy: Can use second multi-line macro after multi-line macro", "[parsing][parsingstream]") + { + const std::vector lines{ + "#define LOL HAHA", + "#define testMacro(a, b) a likes b", + "testMacro(", + "Peter,", + "Anna", + ") and testMacro(", + "Anna,", + "Peter", + ")", + }; + + MockParserLineStream mockStream(lines); + DefinesStreamProxy proxy(&mockStream); + + ExpectLine(&proxy, 1, ""); + ExpectLine(&proxy, 2, ""); + ExpectLine(&proxy, 3, ""); + ExpectLine(&proxy, 4, ""); + ExpectLine(&proxy, 5, ""); + ExpectLine(&proxy, 6, "Peter likes Anna and "); + ExpectLine(&proxy, 7, ""); + ExpectLine(&proxy, 8, ""); + ExpectLine(&proxy, 9, "Anna likes Peter"); + + REQUIRE(proxy.Eof()); + } } // namespace test::parsing::impl::defines_stream_proxy