blob: e4c23c5c19d77bd21ae5b514415ea566bb178f68 [file] [log] [blame]
/*
*
* 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" +
" * Prevent renaming of class. Needed for reflection.\n" +
" */\n" +
"goog.exportSymbol('AppName', AppName);\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" +
"/**\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" +
" * Prevent renaming of class. Needed for reflection.\n" +
" */\n" +
"goog.exportSymbol('AppName', AppName);\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" +
"/**\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" +
" * Prevent renaming of class. Needed for reflection.\n" +
" */\n" +
"goog.exportSymbol('AppName', AppName);\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" +
"/**\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));
}
}