diff --git a/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp b/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp index 9523db6f..5e01ae73 100644 --- a/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp +++ b/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp @@ -504,6 +504,7 @@ void DefinesStreamProxy::ExtractParametersFromDefineUsage(const ParserLine& line std::ostringstream currentValue; auto pos = parameterStart + 1; auto valueHasStarted = false; + auto parenthesisDepth = 0; while (true) { if (pos >= line.m_line.size()) @@ -518,11 +519,26 @@ void DefinesStreamProxy::ExtractParametersFromDefineUsage(const ParserLine& line currentValue.str(std::string()); valueHasStarted = false; } + else if(c == '(') + { + valueHasStarted = true; + parenthesisDepth++; + currentValue << c; + } else if (c == ')') { - parameterValues.emplace_back(currentValue.str()); - parameterEnd = pos + 1; - break; + if(parenthesisDepth > 0) + { + valueHasStarted = true; + parenthesisDepth--; + currentValue << c; + } + else + { + parameterValues.emplace_back(currentValue.str()); + parameterEnd = pos + 1; + break; + } } else if (valueHasStarted || !isspace(c)) { diff --git a/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp b/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp index dcb58524..c1d5be92 100644 --- a/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp +++ b/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp @@ -670,4 +670,21 @@ namespace test::parsing::impl::defines_stream_proxy REQUIRE(proxy.Eof()); } + + TEST_CASE("DefinesStreamProxy: Ensure can use parenthesis in parameters values", "[parsing][parsingstream]") + { + const std::vector lines + { + "#define someStuff(param1) Hello param1 World", + "someStuff(A sentence with (parenthesis) and stuff)" + }; + + MockParserLineStream mockStream(lines); + DefinesStreamProxy proxy(&mockStream); + + ExpectLine(&proxy, 1, ""); + ExpectLine(&proxy, 2, "Hello A sentence with (parenthesis) and stuff World"); + + REQUIRE(proxy.Eof()); + } }