BinaryOperatorEmitter: fix missing parentheses in generated JS when using Date properties that are automatically converted to function calls (closes #179)
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
index b37e337..02c7f49 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
@@ -702,6 +702,9 @@
void specialCaseDate(IBinaryOperatorNode node, MemberAccessExpressionNode leftSide)
{
+ if (ASNodeUtils.hasParenOpen(node))
+ write(ASEmitterTokens.PAREN_OPEN);
+
MemberAccessExpressionNode dateNode = (MemberAccessExpressionNode)leftSide;
IIdentifierNode rightSide = (IIdentifierNode)dateNode.getRightOperandNode();
String op = node.getOperator().getOperatorText();
@@ -744,5 +747,8 @@
write(ASEmitterTokens.SPACE);
getWalker().walk(node.getRightOperandNode());
}
+
+ if (ASNodeUtils.hasParenOpen(node))
+ write(ASEmitterTokens.PAREN_CLOSE);
}
}
diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleStatements.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleStatements.java
index 0234544..00648d5 100644
--- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleStatements.java
+++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleStatements.java
@@ -270,6 +270,15 @@
assertOut("var /** @type {number} */ a = this.b.getFullYear()");
}
+ @Test
+ public void testVarDeclaration_withTypeNumberAndAssignedDatePropertyWithRequiredParentheses()
+ {
+ IVariableNode node = (IVariableNode) getNode("function royaleTest_a():Object { var a:Number = (b.fullYear + 1) / 2; }var b:Date;",
+ IVariableNode.class, WRAP_LEVEL_CLASS);
+ asBlockWalker.visitVariable(node);
+ assertOut("var /** @type {number} */ a = (this.b.getFullYear() + 1) / 2");
+ }
+
//----------------------------------
// const declaration
//----------------------------------