diff --git a/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp b/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp index b32cdccdf..0d714ef01 100644 --- a/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp +++ b/src/Parser/Parsing/Impl/DefinesStreamProxy.cpp @@ -559,29 +559,49 @@ bool DefinesStreamProxy::FindNextMacro(const std::string& input, unsigned& input auto wordStart = 0u; auto lastWordEnd = 0u; auto inWord = false; + auto inString = false; + auto stringEscape = false; for (; inputPos < inputSize; inputPos++) { const auto c = input[inputPos]; - if (!inWord) + if (inString) { - if (isalpha(c) || c == '_') + if (!stringEscape) { - wordStart = inputPos; - inWord = true; + if (c == '"') + inString = false; + else if (c == '\\') + stringEscape = true; } + else + stringEscape = false; } else { - if (!isalnum(c) && c != '_') + if (c == '"') + inString = true; + + if (!inWord) { - if (FindMacroForIdentifier(input, wordStart, inputPos, define)) + if (isalpha(c) || c == '_') { - defineStart = wordStart; - return true; + wordStart = inputPos; + inWord = true; } + } + else + { + if (!isalnum(c) && c != '_') + { + if (FindMacroForIdentifier(input, wordStart, inputPos, define)) + { + defineStart = wordStart; + return true; + } - inWord = false; + inWord = false; + } } } } diff --git a/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp b/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp index edcd8d98c..3443d0575 100644 --- a/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp +++ b/test/ParserTests/Parsing/Impl/DefinesStreamProxyTests.cpp @@ -467,6 +467,22 @@ namespace test::parsing::impl::defines_stream_proxy REQUIRE(proxy.Eof()); } + TEST_CASE("DefinesStreamProxy: Ensure does not expand macros in strings", "[parsing][parsingstream]") + { + const std::vector lines{ + "#define TEST Wrong", + "System.out.println(\"TEST\")", + }; + + MockParserLineStream mockStream(lines); + DefinesStreamProxy proxy(&mockStream); + + ExpectLine(&proxy, 1, ""); + ExpectLine(&proxy, 2, "System.out.println(\"TEST\")"); + + REQUIRE(proxy.Eof()); + } + TEST_CASE("DefinesStreamProxy: Ensure simple if is working with truthy value", "[parsing][parsingstream]") { const std::vector lines{ @@ -911,7 +927,7 @@ namespace test::parsing::impl::defines_stream_proxy REQUIRE(proxy.Eof()); } - TEST_CASE("DefinesStreamProxy: Can use strinizing operator inside sample code", "[parsing][parsingstream]") + TEST_CASE("DefinesStreamProxy: Can use stringizing operator inside sample code", "[parsing][parsingstream]") { const std::vector lines{ "#define testMacro(a) System.out.println(#a)",