Allow usage of tab symbols for indents and separators in Ninja files
Closes #10752.
PiperOrigin-RevId: 294427345
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/lexer/NinjaLexer.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/lexer/NinjaLexer.java
index 5fbfa4b..b2812a2 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/lexer/NinjaLexer.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/lexer/NinjaLexer.java
@@ -82,15 +82,13 @@
byte b = step.startByte();
switch (b) {
case ' ':
+ case '\t':
step.skipSpaces();
if (step.getPosition() == 0
|| NinjaToken.NEWLINE.equals(Iterables.getLast(tokens, null))) {
return push(NinjaToken.INDENT);
}
break;
- case '\t':
- step.forceError("Tabs are not allowed, use spaces.");
- return push(NinjaToken.ERROR);
case '\r':
expectedTextKind = TextKind.IDENTIFIER;
step.processLineFeedNewLine();
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 41fefb1..6635378 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
@@ -141,7 +141,7 @@
}
public void skipSpaces() {
- end = eatSequence(position, aByte -> ' ' != aByte);
+ end = eatSequence(position, aByte -> ' ' != aByte && '\t' != aByte);
}
public void skipComment() {
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/NinjaLexerTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/NinjaLexerTest.java
index 88a50a1..94787c3 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/NinjaLexerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/NinjaLexerTest.java
@@ -68,13 +68,17 @@
}
@Test
- public void testDisallowedSymbols() {
+ public void testTabsAreAllowed() {
String text = "abc\n\tcde";
NinjaLexer lexer = createLexer(text);
assertTokenBytes(lexer, NinjaToken.IDENTIFIER, "abc");
assertTokenBytes(lexer, NinjaToken.NEWLINE, null);
- assertError(lexer, "Tabs are not allowed, use spaces.", "\t");
+ assertTokenBytes(lexer, NinjaToken.INDENT, null);
+ assertTokenBytes(lexer, NinjaToken.IDENTIFIER, "cde");
+ }
+ @Test
+ public void testDisallowedSymbols() {
assertError(createLexer("^"), "Symbol is not allowed in the identifier.", "^");
}