Add support for more augmented-assignment operators.
based on my limited understanding of python syntax, the only things we don't support is //= and **=, but it looks like skylark doesn't support the corresponding infix operators.
RELNOTES[NEW]: add support for the '-=', '*=', '/=', and'%=' operators to skylark. Notably, we do not support '|=' because the semantics of skylark sets are sufficiently different from python sets.
--
MOS_MIGRATED_REVID=123889776
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java b/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java
index 1780886..1b10a66 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Lexer.java
@@ -42,13 +42,20 @@
*/
public final class Lexer {
+ // Characters that can come immediately prior to an '=' character to generate
+ // a different token
private static final Map<Character, TokenKind> EQUAL_TOKENS =
- ImmutableMap.<Character, TokenKind>of(
- '=', TokenKind.EQUALS_EQUALS,
- '!', TokenKind.NOT_EQUALS,
- '>', TokenKind.GREATER_EQUALS,
- '<', TokenKind.LESS_EQUALS,
- '+', TokenKind.PLUS_EQUALS);
+ ImmutableMap.<Character, TokenKind>builder()
+ .put('=', TokenKind.EQUALS_EQUALS)
+ .put('!', TokenKind.NOT_EQUALS)
+ .put('>', TokenKind.GREATER_EQUALS)
+ .put('<', TokenKind.LESS_EQUALS)
+ .put('+', TokenKind.PLUS_EQUALS)
+ .put('-', TokenKind.MINUS_EQUALS)
+ .put('*', TokenKind.STAR_EQUALS)
+ .put('/', TokenKind.SLASH_EQUALS)
+ .put('%', TokenKind.PERCENT_EQUALS)
+ .build();
private final EventHandler eventHandler;
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
index d446e3f..a5ca8bd 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
@@ -168,10 +168,15 @@
.put(TokenKind.STAR, Operator.MULT)
.build();
+ // TODO(bazel-team): add support for |=
private static final Map<TokenKind, Operator> augmentedAssignmentMethods =
new ImmutableMap.Builder<TokenKind, Operator>()
- .put(TokenKind.PLUS_EQUALS, Operator.PLUS) // += // TODO(bazel-team): other similar operators
- .build();
+ .put(TokenKind.PLUS_EQUALS, Operator.PLUS)
+ .put(TokenKind.MINUS_EQUALS, Operator.MINUS)
+ .put(TokenKind.STAR_EQUALS, Operator.MULT)
+ .put(TokenKind.SLASH_EQUALS, Operator.DIVIDE)
+ .put(TokenKind.PERCENT_EQUALS, Operator.PERCENT)
+ .build();
/** Highest precedence goes last.
* Based on: http://docs.python.org/2/reference/expressions.html#operator-precedence
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/TokenKind.java b/src/main/java/com/google/devtools/build/lib/syntax/TokenKind.java
index 283b6c4..8000546 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/TokenKind.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/TokenKind.java
@@ -70,6 +70,10 @@
PIPE("|"),
PLUS("+"),
PLUS_EQUALS("+="),
+ MINUS_EQUALS("-="),
+ STAR_EQUALS("*="),
+ SLASH_EQUALS("/="),
+ PERCENT_EQUALS("%="),
RAISE("raise"),
RBRACE("}"),
RBRACKET("]"),
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
index 4b3b019..235eb39 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
@@ -446,6 +446,10 @@
@Test
public void testAugmentedAssign() throws Exception {
assertEquals("[x = x + 1\n]", parseFile("x += 1").toString());
+ assertEquals("[x = x - 1\n]", parseFile("x -= 1").toString());
+ assertEquals("[x = x * 1\n]", parseFile("x *= 1").toString());
+ assertEquals("[x = x / 1\n]", parseFile("x /= 1").toString());
+ assertEquals("[x = x % 1\n]", parseFile("x %= 1").toString());
}
@Test