Fix for issue #3942.


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5951 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/js/JsParser.java b/dev/core/src/com/google/gwt/dev/js/JsParser.java
index d8b9d1b..32a8632 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsParser.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsParser.java
@@ -1197,9 +1197,12 @@
         return mapPrefixOperation(JsUnaryOperator.TYPEOF, unOp);
 
       case TokenStream.ADD:
-        // Pretend we didn't see it.
-        return mapExpression(unOp.getFirstChild());
-
+        if (unOp.getFirstChild().getType() != TokenStream.NUMBER) {
+          return mapPrefixOperation(JsUnaryOperator.POS, unOp);
+        } else {
+          // Pretend we didn't see it.
+          return mapExpression(unOp.getFirstChild());
+        }
       case TokenStream.VOID:
         return mapPrefixOperation(JsUnaryOperator.VOID, unOp);
 
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperator.java b/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperator.java
index 0520f01..66abc96 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperator.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsUnaryOperator.java
@@ -25,8 +25,9 @@
    */
 
   BIT_NOT("~", 14, PREFIX), DEC("--", 14, POSTFIX | PREFIX), DELETE("delete",
-      14, PREFIX), INC("++", 14, POSTFIX | PREFIX), NEG("-", 14, PREFIX), NOT(
-      "!", 14, PREFIX), TYPEOF("typeof", 14, PREFIX), VOID("void", 14, PREFIX);
+      14, PREFIX), INC("++", 14, POSTFIX | PREFIX), NEG("-", 14, PREFIX),
+      POS("+", 14, PREFIX), NOT("!", 14, PREFIX), 
+      TYPEOF("typeof", 14, PREFIX), VOID("void", 14, PREFIX);
 
   private final int mask;
 
diff --git a/dev/core/test/com/google/gwt/dev/js/JsToStringGenerationVisitorAccuracyTest.java b/dev/core/test/com/google/gwt/dev/js/JsToStringGenerationVisitorAccuracyTest.java
index b5d3479..4eaed72 100644
--- a/dev/core/test/com/google/gwt/dev/js/JsToStringGenerationVisitorAccuracyTest.java
+++ b/dev/core/test/com/google/gwt/dev/js/JsToStringGenerationVisitorAccuracyTest.java
@@ -135,6 +135,10 @@
   public void testUnaryOperations() throws Exception {
     // spaces or parentheses are necessary to separate negation and decrement
     doTest("var x = -(-(--y))");
+    // + prefix not stripped when operand is not literal number
+    doTest("var x = +y", "var x = +y");
+    // + prefix stripped when operand is literal number
+    doTest("var x = +42","var x = 42");
   }
 
   private void doTest(String js) throws Exception {
@@ -147,6 +151,14 @@
     ComparingVisitor.exec(expected, actual);
   }
 
+  private void doTest(String js, String expectedJs) throws Exception {
+    List<JsStatement> actual = JsParser.parse(SourceOrigin.UNKNOWN,
+        new JsProgram().getScope(), new StringReader(js));
+    List<JsStatement> expected = JsParser.parse(SourceOrigin.UNKNOWN,
+        new JsProgram().getScope(), new StringReader(expectedJs));
+    ComparingVisitor.exec(expected, actual);
+  }
+
   private List<JsStatement> parse(List<JsStatement> expected, boolean compact)
       throws Exception {
     TextOutput text = new DefaultTextOutput(compact);