Support # symbol in text fragments (do not treat it as a comment)
It appears in commands, and Ninja does not have the $-escape for it.
Closes #10831.
PiperOrigin-RevId: 296199634
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/lexer/NinjaLexerStep.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/lexer/NinjaLexerStep.java
index 7ce48d1..1dbec92 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/lexer/NinjaLexerStep.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/lexer/NinjaLexerStep.java
@@ -46,7 +46,7 @@
public class NinjaLexerStep {
private static final ImmutableSortedSet<Byte> IDENTIFIER_SYMBOLS =
createByteSet("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-");
- private static final ImmutableSortedSet<Byte> TEXT_STOPPERS = createByteSet("\n\r \t#$:\u0000");
+ private static final ImmutableSortedSet<Byte> TEXT_STOPPERS = createByteSet("\n\r \t$:\u0000");
// We allow # symbol in the path, so the comment on the line with path can only start with space.
private static final ImmutableSortedSet<Byte> PATH_STOPPERS = createByteSet("\n\r \t$:|\u0000");
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/NinjaParserStepTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/NinjaParserStepTest.java
index ad54205..665c7f0 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/NinjaParserStepTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/NinjaParserStepTest.java
@@ -49,7 +49,7 @@
doTestSimpleVariable("a=b\nc", "a", "b");
doTestSimpleVariable("a=b # comment", "a", "b");
doTestSimpleVariable("a.b.c = some long: value", "a.b.c", "some long: value");
- doTestSimpleVariable("a_11_24-rt.15= ^&%=#@", "a_11_24-rt.15", "^&%=");
+ doTestSimpleVariable("a_11_24-rt.15= ^&%=#@", "a_11_24-rt.15", "^&%=#@");
}
@Test
@@ -163,6 +163,20 @@
}
@Test
+ public void testNinjaRuleWithHash() throws Exception {
+ // Additionally test the situation when we get more line separators in the end.
+ NinjaParserStep parser =
+ createParser(
+ "rule testRule \n"
+ + " command = executable --flag $TARGET $out && sed -e 's/#.*$$//' -e '/^$$/d'\n"
+ + " description = Test rule for $TARGET");
+ NinjaRule ninjaRule = parser.parseNinjaRule();
+ assertThat(ninjaRule.getVariables().get(NinjaRuleVariable.COMMAND).getRawText())
+ // Variables are wrapped with {} by print function, $$ escape sequence is unescaped.
+ .isEqualTo("executable --flag ${TARGET} ${out} && sed -e 's/#.*$//' -e '/^$/d'");
+ }
+
+ @Test
public void testVariableWithoutValue() throws Exception {
NinjaParserStep parser =
createParser(