diff --git a/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp b/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp index 5e01ae73..f0926825 100644 --- a/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp +++ b/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp @@ -149,7 +149,7 @@ void DefinesStreamProxy::ContinueDefine(const ParserLine& line) const auto lineEndEscapePos = GetLineEndEscapePos(line); if (lineEndEscapePos < 0) { - m_current_define_value << line.m_line << " "; + m_current_define_value << line.m_line; m_current_define.m_value = m_current_define_value.str(); m_current_define.IdentifyParameters(m_current_define_parameters); AddDefine(std::move(m_current_define)); @@ -162,7 +162,7 @@ void DefinesStreamProxy::ContinueDefine(const ParserLine& line) else { if (line.m_line.size() > static_cast(lineEndEscapePos)) - m_current_define_value << line.m_line.substr(0, static_cast(lineEndEscapePos)) << " "; + m_current_define_value << line.m_line.substr(0, static_cast(lineEndEscapePos)); } } @@ -245,8 +245,8 @@ bool DefinesStreamProxy::MatchDefineDirective(const ParserLine& line, const unsi m_current_define_value.str(std::string()); m_current_define_parameters = std::move(parameters); - if (currentPos < line.m_line.size() && (currentPos + 1) > static_cast(lineEndEscapePos)) - m_current_define_value << line.m_line.substr(currentPos + 1, static_cast(lineEndEscapePos) - (currentPos + 1)) << " "; + if (currentPos < line.m_line.size() && (currentPos + 1) < static_cast(lineEndEscapePos)) + m_current_define_value << line.m_line.substr(currentPos + 1, static_cast(lineEndEscapePos) - (currentPos + 1)); } return true; diff --git a/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp b/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp index c1d5be92..28eb3a0e 100644 --- a/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp +++ b/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp @@ -687,4 +687,23 @@ namespace test::parsing::impl::defines_stream_proxy REQUIRE(proxy.Eof()); } + + TEST_CASE("DefinesStreamProxy: Ensure defines can go over multiple lines", "[parsing][parsingstream]") + { + const std::vector lines + { + "#define someStuff(param1) Hello param1 World \\", + "and hello universe", + "someStuff(lovely)" + }; + + MockParserLineStream mockStream(lines); + DefinesStreamProxy proxy(&mockStream); + + ExpectLine(&proxy, 1, ""); + ExpectLine(&proxy, 2, ""); + ExpectLine(&proxy, 3, "Hello lovely World and hello universe"); + + REQUIRE(proxy.Eof()); + } }