add test for and fix chain binding in output
Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/eb2da04a Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/eb2da04a Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/eb2da04a Branch: refs/heads/master Commit: eb2da04ac99da81cf1d85ce1afab3ad5aa414345 Parents: 1fc24a7 Author: Alex Harui <[email protected]> Authored: Tue Jan 17 13:36:03 2017 -0800 Committer: Alex Harui <[email protected]> Committed: Tue Jan 17 13:36:10 2017 -0800 ---------------------------------------------------------------------- .../mxml/flexjs/TestFlexJSMXMLApplication.java | 158 +++++++++++++++++++ .../flexjs/files/binding/ComplexValueObject.as | 46 ++++++ .../flexjs/files/binding/SimpleValueObject.as | 26 +++ .../codegen/databinding/BindingInfo.java | 42 ++++- 4 files changed, 269 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/eb2da04a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/TestFlexJSMXMLApplication.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/TestFlexJSMXMLApplication.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/TestFlexJSMXMLApplication.java index d3f1302..e740b6e 100644 --- a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/TestFlexJSMXMLApplication.java +++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/TestFlexJSMXMLApplication.java @@ -34,6 +34,7 @@ import org.junit.Test; import java.io.File; import java.util.ArrayList; +import java.util.List; public class TestFlexJSMXMLApplication extends FlexJSTestBase { @@ -519,4 +520,161 @@ public class TestFlexJSMXMLApplication extends FlexJSTestBase assertOutWithMetadata(outTemplate.replaceAll("AppName", appName)); } + + @Test + public void testChainBinding() + { + String code = "<basic:Application xmlns:fx=\"http://ns.adobe.com/mxml/2009\" xmlns:basic=\"library://ns.apache.org/flexjs/basic\">" + + "<fx:Script><![CDATA[" + + " import binding.ComplexValueObject;\n" + + " public var firstOne:ComplexValueObject;\n" + + "]]></fx:Script><basic:initialView><basic:Label text=\"{firstOne.subObject.labelText}\"/></basic:initialView></basic:Application>"; + + IMXMLDocumentNode dnode = (IMXMLDocumentNode) getNode(code, + IMXMLDocumentNode.class, FlexJSTestBase.WRAP_LEVEL_NONE); + + ((JSFlexJSEmitter)(mxmlBlockWalker.getASEmitter())).getModel().setCurrentClass(dnode.getDefinition()); + mxmlBlockWalker.visitDocument(dnode); + String appName = dnode.getQualifiedName(); + String outTemplate = "/**\n" + + " * AppName\n" + + " *\n" + + " * @fileoverview\n" + + " *\n" + + " * @suppress {checkTypes|accessControls}\n" + + " */\n" + + "\n" + + "goog.provide('AppName');\n" + + "\n" + + "goog.require('org.apache.flex.core.Application');\n" + + "goog.require('org.apache.flex.html.Label');\n" + + "goog.require('binding.ComplexValueObject');\n" + + "\n" + + "\n" + + "\n" + + "/**\n" + + " * @constructor\n" + + " * @extends {org.apache.flex.core.Application}\n" + + " */\n" + + "AppName = function() {\n" + + " AppName.base(this, 'constructor');\n" + + " \n" + + " /**\n" + + " * @private\n" + + " * @type {org.apache.flex.html.Label}\n" + + " */\n" + + " this.$ID0_;\n" + + " \n" + + " /**\n" + + " * @private\n" + + " * @type {Array}\n" + + " */\n" + + " this.mxmldd;\n" + + " \n" + + " /**\n" + + " * @private\n" + + " * @type {Array}\n" + + " */\n" + + " this.mxmldp;\n" + + "\n" + + " this.generateMXMLAttributes\n" + + " ([1,\n" + + "'initialView',\n" + + "false,\n" + + "[org.apache.flex.html.Label, 1, '_id', true, '$ID0', 0, 0, null],\n" + + "0,\n" + + "0\n" + + " ]);\n" + + " \n" + + "};\n" + + "goog.inherits(AppName, org.apache.flex.core.Application);\n" + + "\n" + + "\n" + + "\n" + + "/**\n" + + " * @export\n" + + " * @type {binding.ComplexValueObject}\n" + + " */\n" + + "AppName.prototype.firstOne;\n" + + "\n" + + "\n" + + "/**\n" + + " * @export\n" + + " */\n" + + "AppName.prototype._bindings = [\n" + + "1,\n" + + "[\"firstOne\", \"subObject\", \"labelText\"],\n" + + "null,\n" + + "[\"$ID0\", \"text\"],\n" + + "0,\n" + + "2,\n" + + "\"firstOne\",\n" + + "null,\n" + + "0,\n" + + "null,\n" + + "[\n" + + "1,\n" + + "2,\n" + + "\"subObject\",\n" + + "\"subObjectChanged\",\n" + + "0,\n" + + "null,\n" + + "[\n" + + "2,\n" + + "2,\n" + + "\"labelText\",\n" + + "\"propertyChange\",\n" + + "0,\n" + + "null,\n" + + "null,\n" + + "null],\n" + + "null]];\n" + + "/**\n" + + " * Metadata\n" + + " *\n" + + " * @type {Object.<string, Array.<Object>>}\n" + + " */\n" + + "AppName.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'AppName', qName: 'AppName', kind: 'class' }] };\n" + + "\n" + + "\n" + + "/**\n" + + " * Prevent renaming of class. Needed for reflection.\n" + + " */\n" + + "goog.exportSymbol('AppName', AppName);\n" + + "\n" + + "\n" + + "\n" + + "/**\n" + + " * Reflection\n" + + " *\n" + + " * @return {Object.<string, Function>}\n" + + " */\n" + + "AppName.prototype.FLEXJS_REFLECTION_INFO = function () {\n" + + " return {\n" + + " variables: function () {\n" + + " return {\n" + + " 'firstOne': { type: 'binding.ComplexValueObject'}\n" + + " };\n" + + " },\n" + + " accessors: function () {return {};},\n" + + " methods: function () {\n" + + " return {\n" + + " 'AppName': { type: '', declaredBy: 'AppName'}\n"+ + " };\n" + + " }\n" + + " };\n" + + "};\n" + + "\n" + + "\n"; + + assertOutWithMetadata(outTemplate.replaceAll("AppName", appName)); + } + + @Override + protected void addSourcePaths(List<File> sourcePaths) + { + sourcePaths.add(new File(testAdapter.getUnitTestBaseDir(), "flexjs/files")); + super.addSourcePaths(sourcePaths); + } + } http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/eb2da04a/compiler-jx/src/test/resources/flexjs/files/binding/ComplexValueObject.as ---------------------------------------------------------------------- diff --git a/compiler-jx/src/test/resources/flexjs/files/binding/ComplexValueObject.as b/compiler-jx/src/test/resources/flexjs/files/binding/ComplexValueObject.as new file mode 100644 index 0000000..dfedbdc --- /dev/null +++ b/compiler-jx/src/test/resources/flexjs/files/binding/ComplexValueObject.as @@ -0,0 +1,46 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package binding +{ + + public class ComplexValueObject + { + public function ComplexValueObject() + { + } + + private var _subObject:SimpleValueObject; + + [Bindable("subObjectChanged")] + public function get subObject():SimpleValueObject + { + return _subObject; + } + + public function set subObject(value:SimpleValueObject):void + { + if (value != _subObject) + { + _subObject = value; + dispatchEvent(new Event("subObjectChanged")); + } + } + + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/eb2da04a/compiler-jx/src/test/resources/flexjs/files/binding/SimpleValueObject.as ---------------------------------------------------------------------- diff --git a/compiler-jx/src/test/resources/flexjs/files/binding/SimpleValueObject.as b/compiler-jx/src/test/resources/flexjs/files/binding/SimpleValueObject.as new file mode 100644 index 0000000..fc6f3c1 --- /dev/null +++ b/compiler-jx/src/test/resources/flexjs/files/binding/SimpleValueObject.as @@ -0,0 +1,26 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package binding +{ + [Bindable] + public class SimpleValueObject + { + public var labelText:String; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/eb2da04a/compiler/src/main/java/org/apache/flex/compiler/internal/codegen/databinding/BindingInfo.java ---------------------------------------------------------------------- diff --git a/compiler/src/main/java/org/apache/flex/compiler/internal/codegen/databinding/BindingInfo.java b/compiler/src/main/java/org/apache/flex/compiler/internal/codegen/databinding/BindingInfo.java index 2946dd4..de4dd58 100644 --- a/compiler/src/main/java/org/apache/flex/compiler/internal/codegen/databinding/BindingInfo.java +++ b/compiler/src/main/java/org/apache/flex/compiler/internal/codegen/databinding/BindingInfo.java @@ -37,9 +37,11 @@ import org.apache.flex.compiler.internal.definitions.ClassDefinition; import org.apache.flex.compiler.internal.definitions.NamespaceDefinition; import org.apache.flex.compiler.internal.scopes.ASScope; import org.apache.flex.compiler.internal.scopes.TypeScope; +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.NodeBase; import org.apache.flex.compiler.projects.ICompilerProject; +import org.apache.flex.compiler.tree.ASTNodeID; import org.apache.flex.compiler.tree.as.IASNode; import org.apache.flex.compiler.tree.as.IExpressionNode; import org.apache.flex.compiler.tree.as.IFunctionCallNode; @@ -509,9 +511,20 @@ public class BindingInfo implements Comparable<BindingInfo> if (leftDef.isPublic()) { if (leftDef instanceof ClassDefinition) + { classDef = (ClassDefinition)leftDef; - sourceString = leftDef.getBaseName() + "." + def.getBaseName(); - isSimplePublicProperty = true; + sourceString = leftDef.getBaseName() + "." + def.getBaseName(); + isSimplePublicProperty = true; + } + else + { + sourceString = buildChain((MemberAccessExpressionNode) leftSide); + if (sourceString != null) + { + sourceString += "." + def.getBaseName(); + isSimplePublicProperty = true; + } + } } } else if (leftSide instanceof IFunctionCallNode) @@ -534,6 +547,29 @@ public class BindingInfo implements Comparable<BindingInfo> } } } - + } + + private String buildChain(MemberAccessExpressionNode mae) + { + IExpressionNode left = mae.getLeftOperandNode(); + if (left.getNodeID() == ASTNodeID.IdentifierID) + { + IExpressionNode right = mae.getRightOperandNode(); + if (right.getNodeID() == ASTNodeID.IdentifierID) + { + return ((IdentifierNode)left).getName() + "." + ((IdentifierNode)right).getName(); + } + } + else if (left.getNodeID() == ASTNodeID.MemberAccessExpressionID) + { + IExpressionNode right = mae.getRightOperandNode(); + if (right.getNodeID() == ASTNodeID.IdentifierID) + { + String l = buildChain((MemberAccessExpressionNode)left); + if (l == null) return null; + return l + "." + ((IdentifierNode)right).getName(); + } + } + return null; } }
