You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2016/11/16 17:06:02 UTC
git commit: [flex-falcon] [refs/heads/develop] - FLEX-35114 improve
Date class handling
Repository: flex-falcon
Updated Branches:
refs/heads/develop 6ec489b34 -> 151b03d58
FLEX-35114 improve Date class handling
Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/151b03d5
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/151b03d5
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/151b03d5
Branch: refs/heads/develop
Commit: 151b03d589ea6570cb120ed67d4e28f97bf89279
Parents: 6ec489b
Author: Alex Harui <ah...@apache.org>
Authored: Wed Nov 16 09:05:50 2016 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Wed Nov 16 09:05:50 2016 -0800
----------------------------------------------------------------------
.../codegen/js/jx/BinaryOperatorEmitter.java | 144 +++++++++----------
.../codegen/js/jx/MemberAccessEmitter.java | 10 +-
.../js/flexjs/TestFlexJSExpressions.java | 10 ++
.../js/flexjs/TestFlexJSGlobalClasses.java | 35 ++++-
4 files changed, 117 insertions(+), 82 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/151b03d5/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
index 98ada1a..4dab0ea 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/BinaryOperatorEmitter.java
@@ -38,6 +38,7 @@ import org.apache.flex.compiler.internal.tree.as.FunctionCallNode;
import org.apache.flex.compiler.internal.tree.as.IdentifierNode;
import org.apache.flex.compiler.internal.tree.as.MemberAccessExpressionNode;
import org.apache.flex.compiler.internal.tree.as.UnaryOperatorAtNode;
+import org.apache.flex.compiler.problems.AssignToReadOnlyPropertyProblem;
import org.apache.flex.compiler.tree.ASTNodeID;
import org.apache.flex.compiler.tree.as.IASNode;
import org.apache.flex.compiler.tree.as.IBinaryOperatorNode;
@@ -512,8 +513,42 @@ public class BinaryOperatorEmitter extends JSSubEmitter implements
write(ASEmitterTokens.PAREN_CLOSE);
}
- private enum DateProperties
+ public static enum DatePropertiesGetters
{
+ TIME("time", "getTime"),
+ FULLYEAR("fullYear", "getFullYear"),
+ MONTH("month", "getMonth"),
+ DATE("date", "getDate"),
+ FULLYEARUTC("fullYearUTC", "getUTCFullYear"),
+ MONTHUTC("monthUTC", "getUTCMonth"),
+ DATEUTC("dateUTC", "getUTCDate"),
+ HOURS("hours", "getHours"),
+ MINUTES("minutes", "getMinutes"),
+ SECONDS("seconds", "getSeconds"),
+ MILLISECONDS("milliseconds", "getMilliseconds"),
+ HOURSUTC("hoursUTC", "getUTCHours"),
+ MINUTESUTC("minutesUTC", "getUTCMinutes"),
+ SECONDSUTC("secondsUTC", "getUTCSeconds"),
+ MILLISECONDSUTC("millisecondsUTC", "getUTCMilliseconds");
+
+ DatePropertiesGetters(String value, String functionName)
+ {
+ this.value = value;
+ this.functionName = functionName;
+ }
+
+ private String value;
+ private String functionName;
+
+ public String getFunctionName()
+ {
+ return functionName;
+ }
+ }
+
+ public static enum DatePropertiesSetters
+ {
+ TIME("time", "setTime"),
FULLYEAR("fullYear", "setFullYear"),
MONTH("month", "setMonth"),
DATE("date", "setDate"),
@@ -529,7 +564,7 @@ public class BinaryOperatorEmitter extends JSSubEmitter implements
SECONDSUTC("secondsUTC", "setUTCSeconds"),
MILLISECONDSUTC("millisecondsUTC", "setUTCMilliseconds");
- DateProperties(String value, String functionName)
+ DatePropertiesSetters(String value, String functionName)
{
this.value = value;
this.functionName = functionName;
@@ -548,86 +583,45 @@ public class BinaryOperatorEmitter extends JSSubEmitter implements
{
MemberAccessExpressionNode dateNode = (MemberAccessExpressionNode)leftSide;
IIdentifierNode rightSide = (IIdentifierNode)dateNode.getRightOperandNode();
+ String op = node.getOperator().getOperatorText();
+ boolean isAssignment = op.contains("=")
+ && !op.contains("==")
+ && !(op.startsWith("<") || op.startsWith(">") || op
+ .startsWith("!"));
getWalker().walk(dateNode.getLeftOperandNode());
String rightName = rightSide.getName();
- DateProperties prop = DateProperties.valueOf(rightName.toUpperCase());
- write(ASEmitterTokens.MEMBER_ACCESS);
- write(prop.getFunctionName());
- write(ASEmitterTokens.PAREN_OPEN);
- getWalker().walk(node.getRightOperandNode());
- switch (prop)
+ if (isAssignment)
{
- case FULLYEAR:
- write(ASEmitterTokens.COMMA);
- write(ASEmitterTokens.SPACE);
- getWalker().walk(dateNode.getLeftOperandNode());
- write(ASEmitterTokens.MEMBER_ACCESS);
- write("getMonth()");
- // fall through
- case MONTH:
- write(ASEmitterTokens.COMMA);
- write(ASEmitterTokens.SPACE);
- getWalker().walk(dateNode.getLeftOperandNode());
- write(ASEmitterTokens.MEMBER_ACCESS);
- write("getDate()");
- break;
- case FULLYEARUTC:
- write(ASEmitterTokens.COMMA);
- write(ASEmitterTokens.SPACE);
- getWalker().walk(dateNode.getLeftOperandNode());
- write(ASEmitterTokens.MEMBER_ACCESS);
- write("getMonthUTC()");
- // fall through
- case MONTHUTC:
- write(ASEmitterTokens.COMMA);
- write(ASEmitterTokens.SPACE);
- getWalker().walk(dateNode.getLeftOperandNode());
- write(ASEmitterTokens.MEMBER_ACCESS);
- write("getDateUTC()");
- break;
- case HOURS:
- write(ASEmitterTokens.COMMA);
- write(ASEmitterTokens.SPACE);
- getWalker().walk(dateNode.getLeftOperandNode());
+ DatePropertiesSetters prop = DatePropertiesSetters.valueOf(rightName.toUpperCase());
write(ASEmitterTokens.MEMBER_ACCESS);
- write("getMinutes()");
- // fall through
- case MINUTES:
- write(ASEmitterTokens.COMMA);
- write(ASEmitterTokens.SPACE);
- getWalker().walk(dateNode.getLeftOperandNode());
- write(ASEmitterTokens.MEMBER_ACCESS);
- write("getSeconds()");
- // fall through
- case SECONDS:
- write(ASEmitterTokens.COMMA);
- write(ASEmitterTokens.SPACE);
- getWalker().walk(dateNode.getLeftOperandNode());
- write(ASEmitterTokens.MEMBER_ACCESS);
- write("getMilliseconds()");
- break;
- case HOURSUTC:
- write(ASEmitterTokens.COMMA);
- write(ASEmitterTokens.SPACE);
- getWalker().walk(dateNode.getLeftOperandNode());
+ write(prop.getFunctionName());
+ write(ASEmitterTokens.PAREN_OPEN);
+ if (op.length() > 1)
+ {
+ DatePropertiesGetters propGetter = DatePropertiesGetters.valueOf(rightName.toUpperCase());
+ getWalker().walk(dateNode.getLeftOperandNode());
+ write(ASEmitterTokens.MEMBER_ACCESS);
+ write(propGetter.getFunctionName());
+ write(ASEmitterTokens.PAREN_OPEN);
+ write(ASEmitterTokens.PAREN_CLOSE);
+ write(ASEmitterTokens.SPACE);
+ write(op.substring(0, 1));
+ write(ASEmitterTokens.SPACE);
+ }
+ getWalker().walk(node.getRightOperandNode());
+ write(ASEmitterTokens.PAREN_CLOSE);
+ }
+ else
+ {
+ DatePropertiesGetters propGetter = DatePropertiesGetters.valueOf(rightName.toUpperCase());
write(ASEmitterTokens.MEMBER_ACCESS);
- write("getUTCMinutes()");
- // fall through
- case MINUTESUTC:
- write(ASEmitterTokens.COMMA);
+ write(propGetter.getFunctionName());
+ write(ASEmitterTokens.PAREN_OPEN);
+ write(ASEmitterTokens.PAREN_CLOSE);
write(ASEmitterTokens.SPACE);
- getWalker().walk(dateNode.getLeftOperandNode());
- write(ASEmitterTokens.MEMBER_ACCESS);
- write("getUTCSeconds()");
- // fall through
- case SECONDSUTC:
- write(ASEmitterTokens.COMMA);
+ write(op);
write(ASEmitterTokens.SPACE);
- getWalker().walk(dateNode.getLeftOperandNode());
- write(ASEmitterTokens.MEMBER_ACCESS);
- write("getUTCMilliseconds()");
- break;
+ getWalker().walk(node.getRightOperandNode());
}
- write(ASEmitterTokens.PAREN_CLOSE);
}
}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/151b03d5/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
index afe5d95..0c37490 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
@@ -29,6 +29,7 @@ import org.apache.flex.compiler.internal.codegen.js.JSSubEmitter;
import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitter;
import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitterTokens;
import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitterTokens;
+import org.apache.flex.compiler.internal.codegen.js.jx.BinaryOperatorEmitter.DatePropertiesGetters;
import org.apache.flex.compiler.internal.definitions.AccessorDefinition;
import org.apache.flex.compiler.internal.definitions.FunctionDefinition;
import org.apache.flex.compiler.internal.tree.as.FunctionCallNode;
@@ -167,13 +168,10 @@ public class MemberAccessEmitter extends JSSubEmitter implements
else if (fjs.isDateProperty(node))
{
writeLeftSide(node, leftNode, rightNode);
- write(".get");
String rightName = ((IIdentifierNode)rightNode).getName();
- String firstChar = rightName.substring(0, 1);
- firstChar = firstChar.toUpperCase();
- rightName = rightName.substring(1);
- write(firstChar);
- write(rightName);
+ DatePropertiesGetters propGetter = DatePropertiesGetters.valueOf(rightName.toUpperCase());
+ write(ASEmitterTokens.MEMBER_ACCESS);
+ write(propGetter.getFunctionName());
write(ASEmitterTokens.PAREN_OPEN);
write(ASEmitterTokens.PAREN_CLOSE);
return;
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/151b03d5/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java
index 3240840..8873627 100644
--- a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java
@@ -713,6 +713,16 @@ public class TestFlexJSExpressions extends TestGoogExpressions
}
@Test
+ public void testVisitBinaryOperatorNode_LotsOfBuiltinFunctions()
+ {
+ IBinaryOperatorNode node = (IBinaryOperatorNode) getNode(
+ "public class B {public function d() { var seed:Number; seed = new Date().time - Math.random() * int.MAX_VALUE; }}",
+ IBinaryOperatorNode.class, WRAP_LEVEL_PACKAGE);
+ asBlockWalker.visitBinaryOperator(node);
+ assertOut("seed = new Date().getTime() - Math.random() * 2147483648");
+ }
+
+ @Test
public void testNamedFunctionAsArgument()
{
IFunctionNode node = (IFunctionNode) getNode(
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/151b03d5/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
index 9d7f50b..58324bd 100644
--- a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
@@ -209,6 +209,31 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
}
@Test
+ public void testDateGetTimeInMilliseconds()
+ {
+ IVariableNode node = getVariable("var a:Date = new Date(); var b:Number = a.time");
+ node = (IVariableNode)(node.getParent().getChild(1));
+ asBlockWalker.visitVariable(node);
+ assertOut("var /** @type {number} */ b = a.getTime()");
+ }
+
+ @Test
+ public void testDateSetTimeInMilliseconds()
+ {
+ IBinaryOperatorNode node = getBinaryNode("var a:Date = new Date(); a.time = 10");
+ asBlockWalker.visitBinaryOperator(node);
+ assertOut("a.setTime(10)");
+ }
+
+ @Test
+ public void testDateIncreaseTimeInMilliseconds()
+ {
+ IBinaryOperatorNode node = getBinaryNode("var a:Date = new Date(); a.time += 10");
+ asBlockWalker.visitBinaryOperator(node);
+ assertOut("a.setTime(a.getTime() + 10)");
+ }
+
+ @Test
public void testDateGetMinutes()
{
IVariableNode node = getVariable("var a:Date = new Date(); var b:Number = a.minutes");
@@ -222,7 +247,15 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
{
IBinaryOperatorNode node = getBinaryNode("var a:Date = new Date(); a.minutes = 10");
asBlockWalker.visitBinaryOperator(node);
- assertOut("a.setMinutes(10, a.getSeconds(), a.getMilliseconds())");
+ assertOut("a.setMinutes(10)");
+ }
+
+ @Test
+ public void testDateIncreaseMinutes()
+ {
+ IBinaryOperatorNode node = getBinaryNode("var a:Date = new Date(); a.minutes += 10");
+ asBlockWalker.visitBinaryOperator(node);
+ assertOut("a.setMinutes(a.getMinutes() + 10)");
}
@Test