/* * * 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 org.apache.flex.compiler.internal.codegen.mxml.flexjs; import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitter; import org.apache.flex.compiler.internal.test.FlexJSTestBase; import org.apache.flex.compiler.tree.mxml.IMXMLDocumentNode; import org.apache.flex.compiler.tree.mxml.IMXMLScriptNode; import org.junit.Test; public class TestFlexJSMXMLScript extends FlexJSTestBase { @Test public void testSuperInScript() { String code = "" + "<fx:Script><![CDATA[" + " override public function addedToParent():void {" + " super.addedToParent();}" + "]]></fx:Script>"; IMXMLScriptNode node = (IMXMLScriptNode) getNode(code, IMXMLScriptNode.class, FlexJSTestBase.WRAP_LEVEL_DOCUMENT); IMXMLDocumentNode dnode = (IMXMLDocumentNode) node .getAncestorOfType(IMXMLDocumentNode.class); ((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" + "\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 {Array}\n" + " */\n" + " this.mxmldd;\n" + " \n" + " /**\n" + " * @private\n" + " * @type {Array}\n" + " */\n" + " this.mxmldp;\n" + "};\n" + "goog.inherits(AppName, org.apache.flex.core.Application);\n" + "\n" + "\n" + "\n" + "/**\n" + " * @export\n" + " * @override\n" + " */\n" + "AppName.prototype.addedToParent = function() {\n" + " AppName.superClass_.addedToParent.apply(this);\n" + "};\n" + "\n" + "\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 () {return {};},\n" + " accessors: function () {return {};},\n" + " methods: function () {\n" + " return {\n" + " 'addedToParent': { type: 'void', declaredBy: 'AppName'},\n" + " 'AppName': { type: '', declaredBy: 'AppName'}\n" + " };\n" + " }\n" + " };\n" + "};\n" + "\n" + "\n"; assertOutWithMetadata(outTemplate.replaceAll("AppName", appName)); } @Test public void testFunctionAssignmentInScript() { String code = "" + "<fx:Script><![CDATA[" + " private var foo:Function = bar;" + " public function bar():void {};" + "]]></fx:Script>"; IMXMLScriptNode node = (IMXMLScriptNode) getNode(code, IMXMLScriptNode.class, FlexJSTestBase.WRAP_LEVEL_DOCUMENT); IMXMLDocumentNode dnode = (IMXMLDocumentNode) node .getAncestorOfType(IMXMLDocumentNode.class); ((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" + "\n" + "\n" + "\n" + "/**\n" + " * @constructor\n" + " * @extends {org.apache.flex.core.Application}\n" + " */\n" + "AppName = function() {\n" + " AppName.base(this, 'constructor');\n" + " \n" + " this.foo = org.apache.flex.utils.Language.closure(this.bar, this, 'bar');\n" + " /**\n" + " * @private\n" + " * @type {Array}\n" + " */\n" + " this.mxmldd;\n" + " \n" + " /**\n" + " * @private\n" + " * @type {Array}\n" + " */\n" + " this.mxmldp;\n" + "};\n" + "goog.inherits(AppName, org.apache.flex.core.Application);\n" + "\n" + "\n" + "\n" + "/**\n" + " * @private\n" + " * @type {Function}\n" + " */\n" + "AppName.prototype.foo;\n" + "\n" + "\n" + "/**\n" + " * @export\n" + " */\n" + "AppName.prototype.bar = function() {\n" + "};\n" + "\n" + "\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 () {return {};},\n" + " accessors: function () {return {};},\n" + " methods: function () {\n" + " return {\n" + " 'bar': { type: 'void', declaredBy: 'AppName'},\n" + " 'AppName': { type: '', declaredBy: 'AppName'}\n" + " };\n" + " }\n" + " };\n" + "};\n" + "\n" + "\n"; assertOutWithMetadata(outTemplate.replaceAll("AppName", appName)); } @Test public void testComplexInitializersInScript() { String code = "" + "<fx:Script><![CDATA[" + " public var foo:Array = ['foo'];" + "]]></fx:Script>"; IMXMLScriptNode node = (IMXMLScriptNode) getNode(code, IMXMLScriptNode.class, FlexJSTestBase.WRAP_LEVEL_DOCUMENT); IMXMLDocumentNode dnode = (IMXMLDocumentNode) node .getAncestorOfType(IMXMLDocumentNode.class); ((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" + "\n" + "\n" + "\n" + "/**\n" + " * @constructor\n" + " * @extends {org.apache.flex.core.Application}\n" + " */\n" + "AppName = function() {\n" + " AppName.base(this, 'constructor');\n" + " \n" + " this.foo = ['foo'];\n" + " /**\n" + " * @private\n" + " * @type {Array}\n" + " */\n" + " this.mxmldd;\n" + " \n" + " /**\n" + " * @private\n" + " * @type {Array}\n" + " */\n" + " this.mxmldp;\n" + "};\n" + "goog.inherits(AppName, org.apache.flex.core.Application);\n" + "\n" + "\n" + "\n" + "/**\n" + " * @export\n" + " * @type {Array}\n" + " */\n" + "AppName.prototype.foo;\n" + "\n" + "\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" + " 'foo': { type: 'Array'}\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)); } }