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);