diff options
author | 2016-06-02 18:37:13 +0000 | |
---|---|---|
committer | 2016-06-03 12:53:44 +0000 | |
commit | 13151750e47f08f67a3f234952e2dbbbe617352d (patch) | |
tree | 525ede9d3e914db326c491500ce24bf5e1f8077c /src | |
parent | 1bfa4017954f723e31c10c21b7510dae2ac3c8e6 (diff) |
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
Diffstat (limited to 'src')
4 files changed, 28 insertions, 8 deletions
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 1780886059..1b10a667a6 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 @@ import java.util.Stack; */ 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 d446e3f2be..a5ca8bdb9a 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 @@ public class Parser { .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 283b6c40d4..8000546fef 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 @@ public enum TokenKind { 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 4b3b019d04..235eb3936d 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 @@ public class ParserTest extends EvaluationTestCase { @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 |