aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-06-02 18:37:13 +0000
committerGravatar Dmitry Lomov <dslomov@google.com>2016-06-03 12:53:44 +0000
commit13151750e47f08f67a3f234952e2dbbbe617352d (patch)
tree525ede9d3e914db326c491500ce24bf5e1f8077c /src
parent1bfa4017954f723e31c10c21b7510dae2ac3c8e6 (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Lexer.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Parser.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/TokenKind.java4
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java4
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