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