http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSWriter.java ---------------------------------------------------------------------- diff --git a/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSWriter.java b/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSWriter.java deleted file mode 100644 index 105452a..0000000 --- a/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSWriter.java +++ /dev/null @@ -1,1443 +0,0 @@ -/* - * - * 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.as.codegen; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.Map; -import java.util.Set; - -import org.apache.flex.abc.ABCConstants; -import org.apache.flex.abc.semantics.Name; -import org.apache.flex.abc.semantics.Namespace; -import org.apache.flex.compiler.clients.MXMLJSC; -import org.apache.flex.compiler.definitions.IDefinition; -import org.apache.flex.compiler.definitions.INamespaceDefinition; -import org.apache.flex.compiler.definitions.metadata.IMetaTag; -import org.apache.flex.compiler.internal.scopes.ASProjectScope; -import org.apache.flex.compiler.internal.units.SWCCompilationUnit; -import org.apache.flex.compiler.problems.ICompilerProblem; -import org.apache.flex.compiler.problems.InternalCompilerProblem; -import org.apache.flex.compiler.projects.ICompilerProject; -import org.apache.flex.compiler.units.ICompilationUnit; -import org.apache.flex.compiler.units.requests.IABCBytesRequestResult; -import org.apache.flex.swf.ISWF; -import org.apache.flex.swf.SWFFrame; -import org.apache.flex.swf.io.ISWFWriter; -import org.apache.flex.swf.io.OutputBitStream; -import org.apache.flex.swf.tags.DoABCTag; -import org.apache.flex.swf.tags.ITag; -import org.apache.flex.swf.TagType; - -import com.google.javascript.jscomp.CompilationLevel; -import com.google.javascript.jscomp.Compiler; -import com.google.javascript.jscomp.CompilerOptions; -import com.google.javascript.jscomp.CommandLineRunner; -import com.google.javascript.jscomp.JSError; -import com.google.javascript.jscomp.JSSourceFile; - -/** - * The implementation of SWF tag, type encoding logic. The SWF file body are - * buffered in memory using {@code IOutputBitStream}. ZLIB compression is - * optional. If enabled, compression is on-the-fly via a filtered output stream. - * JSWriter is modeled after SWFWriter and emits the resulting JS file collected - * from JSEmitters. JSEmitter only collects JS from one JSCompilationUnit - * (usually one class) while JSWriter combines all JS code into one JS file with - * some extra code for static initializers etc. JSDriver creates and uses - * JSWriter for writing SWFs, which are JS files in FalconJS's world. This - * implementation is part of FalconJS. For more details on FalconJS see - * org.apache.flex.compiler.JSDriver - */ -public class JSWriter implements ISWFWriter -{ - private ICompilerProject m_project; - List<ICompilerProblem> m_problems; - - // SWF model - private final ISWF swf; - - private final Collection<ICompilationUnit> compilationUnits; - - // This buffer contains the SWF data after FileLength field. - private final OutputBitStream outputBuffer; - - private Boolean hasStage = false; - - /** - * Create a SWF writer. - * - * @param swf the SWF model to be encoded - * @param useCompression use ZLIB compression if true - */ - public JSWriter(ICompilerProject project, List<ICompilerProblem> problems, ISWF swf, boolean useCompression, boolean enableDebug) - { - this.m_project = project; - this.m_problems = problems; - this.swf = swf; - this.compilationUnits = null; - this.outputBuffer = new OutputBitStream(useCompression); - } - - /** - * Create a SWF writer. - * - * @param abc the ABC bytes to be encoded - * @param useCompression use ZLIB compression if true - */ - public JSWriter(ICompilerProject project, List<ICompilerProblem> problems, Collection<ICompilationUnit> compilationUnits, boolean useCompression) - { - this.m_project = project; - this.m_problems = problems; - this.swf = null; - this.compilationUnits = compilationUnits; - this.outputBuffer = new OutputBitStream(useCompression); - } - - private Boolean isStageCompilationUnit(ICompilationUnit cu) - { - if (cu != null) - { - final String name = cu.getName(); - if (name.endsWith("(flash.display:Stage)")) - return true; - } - return false; - } - - public String getTopLevelClass() - { - if (swf != null) - return swf.getTopLevelClass(); - return null; - } - - private void writeCode(List<byte[]> abcByteList, Boolean createSharedLib) throws InterruptedException - { - // start with the time stamp - // write time stamp to outputBuffer - if (JSSharedData.OUTPUT_TIMESTAMPS) - writeString("/** @preserve " + JSGeneratingReducer.getTimeStampString() + " */\n"); - - if (!JSSharedData.OUTPUT_ISOLATED) - { - // open function closure: function() { ... } - writePrologue(createSharedLib); - - // write out the framework root first. - writeFrameworkRoot(createSharedLib); - - // write out DOM extensions. - writeDomExtensions(); - - // write out copyright notes - writeCopyrightNotes(); - - // write out package names - writePackageNames(createSharedLib); - - // writeExternNames(); - - // write out namespace names - writeNamepaceNames(); - - } - - // Current frame index. Updated in writeFrames(). - for (byte[] abcBytes : abcByteList) - { - /* - * Extract abc from frame, see JSCompilationUnit::addToFrame(): - * doABC.setAbcData(abc.getABCBytes()); doABC.setName("as3"); - * frame.addTag(doABC); - */ - { - // see SWFWriter::writeTag - { - // see SWFWriter::writeDoABC - - Boolean isBinary = false; - /* - * see avm2overview.pdf, chapter 4.2 abcFile { u16 - * minor_version u16 major_version cpool_info constant_pool - * u30 method_count method_info method[method_count] u30 - * metadata_count metadata_info metadata[metadata_count] u30 - * class_count instance_info instance[class_count] - * class_info class[class_count] u30 script_count - * script_info script[script_count] u30 method_body_count - * method_body_info method_body[method_body_count] } - */ - if (abcBytes.length > 2) - { - // 16 00 46 00 - final int minorVersion = 16; - final int majorVersion = 46; - if (abcBytes[0] == minorVersion && - abcBytes[2] == majorVersion) - { - isBinary = true; - - // throw new Error( "Embedded data is not supported yet." ); - - /* - * final AbcDump abcDump = new AbcDump(); - * abcDump.out = JSSharedData.STDOUT; ABCParser - * parser = new ABCParser(abcBytes); - * parser.parseAbc(abcDump); - */ - /* - * try { FileOutputStream out = new - * FileOutputStream("/tmp/falcon-js.abc"); try { - * out.write(abcBytes); out.close(); } catch( - * IOException e ) { } } catch( - * FileNotFoundException e ) { } - */ - } - } - - if (!isBinary) - outputBuffer.write(abcBytes); - } - } - } - - if (createSharedLib || !JSSharedData.OUTPUT_ISOLATED) - { - // write out adobe.finalize(); - writeFinalize(createSharedLib); - - // close closure: function() { ... } - writeEpilogue(createSharedLib); - } - } - - /* - * private Boolean hasEncryptedJS( ICompilationUnit cu ) throws - * InterruptedException { final JSSharedData sharedData = - * JSSharedData.instance; final List<IDefinition> defs = - * MXMLJSC.getDefinitions(cu, false); for( IDefinition def: defs ) { final - * String fullName = def.getQualifiedName(); if( - * sharedData.hasJavaScript(fullName) && sharedData.hasEncryptedJS(fullName) - * ) return true; } return false; } - */ - - private List<byte[]> getAbcData(ISWF swf, Boolean createSharedLib) throws InterruptedException - { - final JSSharedData sharedData = JSSharedData.instance; - final List<byte[]> abcByteList = new ArrayList<byte[]>(); - if (swf == null) - { - for (ICompilationUnit cu : compilationUnits) - { - // only add topLevelClass to Stage if the Stage gets emitted. - if (!hasStage) - hasStage = isStageCompilationUnit(cu); - - final Boolean isSWC = cu instanceof SWCCompilationUnit; - if (createSharedLib == isSWC) - { - final List<IDefinition> defs = MXMLJSC.getDefinitions(cu, false); - for (IDefinition def : defs) - { - final String fullName = def.getQualifiedName(); - if (sharedData.hasJavaScript(fullName)) - { - final String jsCode = sharedData.getJavaScript(fullName); - abcByteList.add(jsCode.getBytes()); - } - } - - final IABCBytesRequestResult codegenResult = cu.getABCBytesRequest().get(); - final byte[] abcBytes = codegenResult.getABCBytes(); - abcByteList.add(abcBytes); - } - } - return abcByteList; - } - - // Current frame index. Updated in writeFrames(). - for (int currentFrameIndex = 0; currentFrameIndex < swf.getFrameCount(); currentFrameIndex++) - { - final SWFFrame frame = swf.getFrameAt(currentFrameIndex); - - // If the SWF has a top level class name, the first frame must contain a SymbolClass tag. - if (0 == currentFrameIndex && null != getTopLevelClass()) - { - SWFFrame.forceSymbolClassTag(frame); - } - - /* - * Extract abc from frame, see JSCompilationUnit::addToFrame(): - * doABC.setAbcData(abc.getABCBytes()); doABC.setName("as3"); - * frame.addTag(doABC); - */ - for (final ITag tag : frame) - { - // see SWFWriter::writeTag - if (tag.getTagType() == TagType.DoABC) - { - // see SWFWriter::writeDoABC - final DoABCTag abcTag = ((DoABCTag)tag); - byte[] abcBytes = abcTag.getABCData(); - - Boolean isBinary = false; - /* - * see avm2overview.pdf, chapter 4.2 abcFile { u16 - * minor_version u16 major_version cpool_info constant_pool - * u30 method_count method_info method[method_count] u30 - * metadata_count metadata_info metadata[metadata_count] u30 - * class_count instance_info instance[class_count] - * class_info class[class_count] u30 script_count - * script_info script[script_count] u30 method_body_count - * method_body_info method_body[method_body_count] } - */ - if (abcBytes.length > 2) - { - // 16 00 46 00 - final int minorVersion = 16; - final int majorVersion = 46; - if (abcBytes[0] == minorVersion && - abcBytes[2] == majorVersion) - { - isBinary = true; - - // throw new Error( "Embedded data is not supported yet." ); - - if (abcTag.getName().startsWith("#")) - sharedData.verboseMessage("ABC: " + abcTag.getName()); - - /* - * final AbcDump abcDump = new AbcDump(); - * abcDump.out = JSSharedData.STDOUT; ABCParser - * parser = new ABCParser(abcBytes); - * parser.parseAbc(abcDump); - */ - /* - * try { FileOutputStream out = new - * FileOutputStream("/tmp/falcon-js.abc"); try { - * out.write(abcBytes); out.close(); } catch( - * IOException e ) { } } catch( - * FileNotFoundException e ) { } - */ - } - } - - if (!isBinary) - { - final ICompilationUnit cu = sharedData.getCompilationUnit(frame); - final Boolean isSWC = cu instanceof SWCCompilationUnit; - - // only add topLevelClass to Stage if the Stage gets emitted. - if (!hasStage) - hasStage = isStageCompilationUnit(cu); - - if (createSharedLib == isSWC) - { - if (cu != null && sharedData.isVerbose()) - { - String str = cu.toString() + ": "; - if (cu instanceof SWCCompilationUnit) - { - Boolean comma = false; - final List<IDefinition> defs = MXMLJSC.getDefinitions(cu, true); - for (IDefinition def : defs) - { - if (comma) - str += ", "; - else - comma = true; - str += JSGeneratingReducer.createFullNameFromDefinition(cu.getProject(), def); - } - } - str += " " + abcBytes.length + " bytes."; - sharedData.verboseMessage(str); - } - - abcByteList.add(abcBytes); - } - } - } - } - } - - return abcByteList; - } - - public void writeTo(OutputStream output) - { - writeTo(output, false); - } - - public void writeLibTo(OutputStream output) - { - writeTo(output, true); - } - - private void writeTo(OutputStream output, Boolean createSharedLib) - { - assert output != null; - - try - { - outputBuffer.reset(); - - List<byte[]> abcByteList = getAbcData(swf, createSharedLib); - if (!abcByteList.isEmpty()) - { - writeCode(abcByteList, createSharedLib); - - // if we are pulling in encrypted JS through a SWC that JS should probably - // go into the shared lib and obfuscated with ADVANCED_OPTIMIZATIONS. Otherwise the whole point - // of encrypting JS would be defeated. - // At this point protecting intellectual property of JS and -js-generate-shared-library - // have a lower priority than other features. - // DISABLED for now: - // if( JSSharedData.OPTIMIZE || (createSharedLib && JSSharedData.instance.hasAnyEncryptedJS()) ) - // optimize( outputBuffer, createSharedLib ); - - // support for optimize=true - // if (JSSharedData.OPTIMIZE) - // optimize(outputBuffer, createSharedLib); - - output.write(outputBuffer.getBytes(), 0, outputBuffer.size()); - output.flush(); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } - catch (InterruptedException e) - { - throw new RuntimeException(e); - } - } - - /** - * Close the internal output buffer that stores the encoded SWF tags and - * part of the SWF header. - */ - public void close() throws IOException - { - outputBuffer.close(); - } - - private void writeString(String s) - { - outputBuffer.write(s.getBytes()); - } - - protected void writeCopyrightNotes() - { - if (!JSSharedData.m_useClosureLib) - { - // Source: http://ejohn.org/blog/simple-javascript-inheritance/ - final String jresigNote = - "/* Simple JavaScript Inheritance\n" + - " * By John Resig http://ejohn.org/\n" + - " * MIT Licensed.\n" + - " *\n" + - " * Adobe Systems Inc. 2010. Modifications:\n" + - " * - added support for getter and setter.\n" + - " * - all objects become jQuery objects if jQuery is present.\n" + - " * - support for calling constructor functions directly, i.e. var s = Sprite();\n" + - " * - ported to ActionScript so this code can be cross-compiled.\n" + - " */\n" + - "// Inspired by base2 and Prototype"; - - // write out the copyright note for John Resig's simple class inheritance in JS: - // http://ejohn.org/blog/simple-javascript-inheritance/ - writeString(jresigNote + "\n\n"); - } - } - - protected void writePackageNames(Boolean createSharedLib) - { - writeString("\n"); - writeString("/**\n"); - writeString(" * Packages \n"); - writeString(" */\n"); - - final Set<String> visited = new HashSet<String>(); - final Set<String> packages = JSSharedData.instance.getPackages(); - for (String name : packages) - { - String packageName = JSSharedData.ROOT_NAME; - String[] parts = name.split("\\."); - for (String part : parts) - { - if (!part.isEmpty()) - { - if (!packageName.isEmpty()) - packageName += "."; - - packageName += part; - if (!visited.contains(packageName)) - { - visited.add(packageName); - - writeString("/** @typedef { Object } */\n"); - if (!packageName.contains(".")) - writeString("var "); - - writeString(packageName + " = { _FULLNAME: \"" + packageName + "\"};\n"); - } - } - } - } - writeString("\n"); - } - - /* - * protected void writeExternNames() { final Set<String> externs = - * JSSharedData.instance.getUsedExterns(); if( !externs.isEmpty() ) { - * writeString( "\n" ); writeString( "/ **\n" ); writeString( - * " * Externs \n" ); writeString( " * /\n" ); for( String defName: externs - * ) { if( JSSharedData.instance.isReferencedDefinition(defName) ) { final - * IDefinition def = JSSharedData.instance.getDefinition(defName); String - * name = null; final IMetaTag extern = - * def.getMetaTagByName(JSSharedData.EXTERN_METATAG); if( extern != null ) - * name = extern.getAttributeValue("name"); if( name == null ) name = - * def.getShortName(); // TODO: get rid of the hard-coded checks. String - * fullName = def.getPackageName(); if( !fullName.isEmpty() ) fullName += - * "."; fullName += def.getName(); if( !fullName.equals(name) ) writeString( - * fullName + " = " + name + ";\n" ); } } writeString( "\n" ); } } - */ - - protected void writeNamepaceNames() - { - final Map<String, INamespaceDefinition> namespaces = JSSharedData.instance.getNamespaces(); - - if (!namespaces.isEmpty()) - { - writeString("\n"); - writeString("/**\n"); - writeString(" * Namespace identifiers \n"); - writeString(" */\n"); - - // see JSGeneratingReducer.reduce_namespaceDeclarationConstantInitializer() for where these get registered - - for (Map.Entry<String, INamespaceDefinition> entry : namespaces.entrySet()) - { - String uri = entry.getKey(); - INamespaceDefinition nsDef = entry.getValue(); - - // TODO: should there be a package qualifier prefix? - String name = nsDef.getBaseName(); - - // TODO: value should really be an object of type Namespace, not a String; see FJS-65 - writeString("var " + name + " = \"" + uri + "\";\n"); - } - writeString("\n"); - } - - } - - protected void writeFrameworkRoot(Boolean createSharedLib) - { - writeString("// Declaring missing types\n"); - writeString("var IntClass = function(){};\n"); - writeString("var UIntClass = function(){};\n"); - writeString("\n"); - - // write out framework root object - if (JSSharedData.m_useClosureLib) - { - writeString("/**\n"); - writeString(" * Framework: " + JSSharedData.JS_FRAMEWORK_NAME + "\n"); - writeString(" */\n"); - // writeString( "goog.provide(\"" + JSSharedData.JS_FRAMEWORK_NAME + "\");\n\n" ); - - if (createSharedLib) - writeString("var " + JSSharedData.JS_FRAMEWORK_NAME + " = __adobe || {};\n\n"); - else - writeString("var " + JSSharedData.JS_FRAMEWORK_NAME + " = {};\n\n"); - - if (!JSSharedData.ROOT_NAME.isEmpty()) - { - String rootName = JSSharedData.ROOT_NAME; - // remove trailing dot - if (rootName.endsWith(".")) - rootName = rootName.substring(0, rootName.length() - 1); - - writeString("/**\n"); - writeString(" * Root: " + rootName + "\n"); - writeString(" */\n"); - writeString("goog.provide(\"" + rootName + "\");\n"); - } - } - else - { - writeString("/**\n"); - writeString(" * Framework: " + JSSharedData.JS_FRAMEWORK_NAME + "\n"); - writeString(" * @type {object}\n"); - writeString(" */\n"); - writeString("var " + JSSharedData.JS_FRAMEWORK_NAME + " = {};\n"); - - } - - writeString(JSSharedData.JS_SYMBOLS + "= {};\n"); - - writeString("\n"); - } - - protected void writeDomExtensions() - { - if (JSSharedData.EXTEND_DOM) - { - final String indent = "\t"; - - // see also: - // http://hg.mozilla.org/tamarin-redux/file/758198237dc1/test/acceptance/ecma3 - // http://qfox.nl/ecma/275 - // http://code.google.com/p/sputniktests/ - // http://es5.github.com/ - - writeString("\n"); - - writeString("// Additions to DOM classes necessary for passin Tamarin's acceptance tests.\n"); - writeString("// Please use -js-extend-dom=false if you want to prevent DOM core objects changes.\n"); - writeString("if( typeof(__global[\"Math\"].NaN) != \"number\" )\n"); - writeString("{\n"); - - writeString(indent + "/**\n"); - writeString(indent + " * @const\n"); - writeString(indent + " * @type {function()}\n"); - writeString(indent + " */\n"); - writeString(indent + "var fnToString = function() { return \"function Function() {}\"; };\n"); - - writeString(indent + "/** @type {object} */\n"); - writeString(indent + "var proto = {};\n"); - - // see e15_8_1.as - writeString("\n"); - writeString(indent + "// Additions to Math\n"); - writeString(indent + "__global[\"Math\"].NaN = NaN;\n"); - - // see e15_8_1.as, ecma3/Array/e15_4_2_1_3. - writeString("\n"); - writeString(indent + "// Additions to Array (see e15_4_1_1, e15_4_2_1_1, e15_4_2_1_3, e15_4_2_2_1)\n"); - writeString(indent + "proto = __global[\"Array\"].prototype;\n"); - writeString(indent + "proto.toString.toString = fnToString;\n"); - writeString(indent + "proto.join.toString = fnToString;\n"); - writeString(indent + "proto.sort.toString = fnToString;\n"); - writeString(indent + "proto.reverse.toString = fnToString;\n"); - - // In browsers, Array.prototype.unshift.length = 1, because - // the this value is coerced to an object. - - // We need to hide unshift after setting it. - // Otherwise we'll get "unshift" for: - // var arr = new Array(); for( n in arr ) { console.info(n); } - writeString(indent + "if( Object.defineProperty )\n"); - writeString(indent + "{\n"); - writeString(indent + indent + "proto.unshift = (function ()\n"); - writeString(indent + indent + "{\n"); - writeString(indent + indent + indent + "/** @type {function()} */\n"); - writeString(indent + indent + indent + "var f = proto.unshift;\n"); - writeString(indent + indent + indent + "return function() { return f.apply(this,arguments); };\n"); - writeString(indent + indent + "})();\n"); - writeString(indent + indent + "Object.defineProperty( proto, \"unshift\", {enumerable: false} );\n"); - writeString(indent + "}\n"); - - // see ecma3/ErrorObject/e15_11_2_1.as - writeString("\n"); - writeString(indent + "// Additions to Error (see e15_11_2_1)\n"); - writeString(indent + "proto = __global[\"Error\"].prototype;\n"); - writeString(indent + "proto.getStackTrace = proto.getStackTrace || function() { return null; };\n"); - writeString(indent + "proto.toString = (function ()\n"); - writeString(indent + "{\n"); - writeString(indent + indent + "/** @type {function()} */\n"); - writeString(indent + indent + "var f = proto.toString;\n"); - writeString(indent + indent + "return function () { return (this.name == this.message || this.message == \"\") ? this.name : f.call(this); };\n"); - writeString(indent + "})();\n"); - - // see ecma3/ErrorObject/e15_11_2_1.as - writeString("\n"); - writeString(indent + "proto = __global[\"Object\"].prototype;\n"); - writeString(indent + "// Additions to Object (see e15_11_2_1)\n"); - writeString(indent + "proto.toString = (function ()\n"); - writeString(indent + "{\n"); - writeString(indent + indent + "/** @type {function()} */\n"); - writeString(indent + indent + "var f = proto.toString;\n"); - writeString(indent + indent + "return function () { return (this instanceof Error) ? (\"[object \" + this.name + \"]\") : f.call(this); };\n"); - writeString(indent + "})();\n"); - - writeString("}\n"); - } - - } - - private void emitSettings() - { - final String topLevelClass = getTopLevelClass(); - if (topLevelClass != null) - { - // support for no export - if (!JSSharedData.NO_EXPORTS) - { - // We are now using createMain() isntead of m_topLevelClass - // writeString( "\tadobe.m_topLevelClass = " + JSSharedData.ROOT_NAME + getTopLevelClass() + ";\n" ); - writeString("\tadobe.m_topLevelClass = null;\n"); - writeString("\tgoog.exportSymbol(\"" + JSSharedData.JS_FRAMEWORK_NAME + ".m_topLevelClass\", " + JSSharedData.JS_FRAMEWORK_NAME + ".m_topLevelClass);\n"); - } - - // emit createMain - String create = "new " + JSSharedData.ROOT_NAME + topLevelClass + "()"; - final String symbolName = JSSharedData.instance.getSymbol(topLevelClass); - if (symbolName != null && !symbolName.isEmpty()) - create = symbolName + "." + JSSharedData.SYMBOL_INSTANCE + "." + JSSharedData.SYMBOL_INIT + "(" + create + ")"; - writeString("\tadobe.createMain = function() { return " + create + "; };\n"); - - } - - // shell.as is using flash.system.Capabilities.playerType, which must be set to "AVMPlus" - // var playerType /* : String */ = flash.system.Capabilities.playerType; - // flash.system.Capabilities.__static_init() must be called before we set playerType, see http://watsonexp.corp.adobe.com/#bug=3021707 - if (JSSharedData.GENERATE_TEST_CASE) - { - writeString("\n"); - writeString("\t// Setting playerType to AVMPlus for running Tamarin's acceptance tests.\n"); - writeString("\tif( flash && flash.system && flash.system.Capabilities )\n"); - writeString("\t{\n"); - writeString("\t\tflash.system.Capabilities.__static_init();\n"); - writeString("\t\tflash.system.Capabilities.playerType = \"AVMPlus\";\n"); - writeString("\t}\n"); - } - } - - /* - * private void emitClassInfo() { writeString( "\n" ); writeString( - * "\t// Class Information \n" ); writeString( "\t" + - * JSSharedData.JS_FRAMEWORK_NAME + ".info = {};\n" ); Map<String,String>map - * = JSSharedData.instance.getClassInfo(); // sorted output final - * TreeSet<String> keys = new TreeSet<String>(map.keySet()); for(String key - * : keys) { final String value = map.get(key); writeString( "\t" + - * JSSharedData.JS_FRAMEWORK_NAME + ".info[\"" + key + "\"] = \"" + value + - * "\";\n" ); } } - */ - /* - * private void emitExports() { writeString( "\n" ); writeString( - * "\t// Exported Symbols\n" ); writeString( "\t" + - * JSSharedData.JS_FRAMEWORK_NAME + ".root = {};\n" ); final Set<String> - * visited = new HashSet<String>(); final Set<Name> classes = - * JSSharedData.instance.getClasses(); List<String> sorted = new - * ArrayList<String>(); for(Name name : classes ) { if( name != null && - * JSSharedData.instance.hasClassBeenEmitted(name) ) { String fullName = ""; - * final String packageName = - * JSGeneratingReducer.getPackageNameFromName(name, false); if( packageName - * != null && !packageName.isEmpty() ) fullName += packageName + "."; - * fullName += name.getBaseName(); String[] parts = fullName.split("\\."); - * fullName = JSSharedData.ROOT_NAME; for( String part: parts ) { if( - * !part.isEmpty() ) { if( !fullName.isEmpty() ) fullName += "."; fullName - * += part; if(!visited.contains(fullName)) { visited.add(fullName); // - * collect symbols for later sorted.add("\tgoog.exportSymbol(\"" + fullName - * + "\", " + fullName + ", " + JSSharedData.JS_FRAMEWORK_NAME + - * ".root);\n"); } } } } } java.util.Collections.sort(sorted); for( String - * s: sorted ) { writeString( s ); } writeString( "\n" ); } - */ - - private void emitInterfacesInfo() - { - writeString("\n"); - writeString("\t// Interfaces Information \n"); - writeString("\t" + JSSharedData.JS_FRAMEWORK_NAME + ".interfaces = {};\n"); - - Map<Name, Set<Name>> map = JSSharedData.instance.getAllInterfaces(); - Iterator<Map.Entry<Name, Set<Name>>> it = map.entrySet().iterator(); - while (it.hasNext()) - { - Map.Entry<Name, Set<Name>> pair = it.next(); - final IDefinition def = JSSharedData.instance.getDefinition(pair.getKey()); - final String className = def.getQualifiedName(); - writeString("\t" + JSSharedData.JS_FRAMEWORK_NAME + ".interfaces[\"" + className + "\"] = "); - writeString("["); - - Boolean emitComma = false; - Set<Name> interfaces = pair.getValue(); - for (Name name : interfaces) - { - if (emitComma) - writeString(", "); - else - emitComma = true; - // writeString( JSGeneratingReducer.getFullNameFromName(name, true) ); - - String fullName = ""; - if (name.getQualifiers().length() > 1) - { - if (!JSSharedData.ROOT_NAME.isEmpty()) - fullName += JSSharedData.ROOT_NAME; - - // Picking a package qualifier at random (if there's more than one). We skip other things like - // namespace qualifiers since their names might be URLs (not syntactically valid). - Namespace packageNS = findAnyPackageQualifier(name); - assert packageNS != null : "Unable to find a usable qualifier for " + name; - - fullName += packageNS.getName(); - fullName += "." + name.getBaseName(); - } - else - { - final IDefinition idef = JSSharedData.instance.getDefinition(name); - fullName = idef.getQualifiedName(); - } - writeString(fullName); - } - - writeString("];\n"); - } - } - - private static Namespace findAnyPackageQualifier(Name name) - { - for (Namespace ns : name.getQualifiers()) - { - if (ns.getKind() == ABCConstants.CONSTANT_PackageNs || ns.getKind() == ABCConstants.CONSTANT_PackageInternalNs) - return ns; - } - return null; - } - - /* - * private void emitStaticInits() { writeString( "\n" ); writeString( - * "\t// Static inits \n" ); // writeString( - * JSSharedData.instance.getStaticInits("\t", "\n") ); // auto-register - * static inits. writeString( "\t" + JSSharedData.JS_RUN_STATIC_INITS + "(" - * + JSSharedData.JS_STATIC_INITS + ");\n" ); writeString( "\tdelete(" + - * JSSharedData.JS_STATIC_INITS + ");\n" ); } - */ - - private void emitScriptInfos() - { - final Set<String> scriptInfos = JSSharedData.instance.getScriptInfos(); - if (!scriptInfos.isEmpty()) - { - writeString("\n"); - for (String si : scriptInfos) - { - writeString(si); - } - } - } - - private void emitSymbolInstances() - { - if (JSSharedData.instance.hasSymbols()) - { - writeString("\n"); - writeString("\n"); - writeString("\t// Symbols \n"); - - final List<String> list = JSSharedData.instance.getSymbols(); - for (String symbol : list) - { - writeString("\t" + JSSharedData.ROOT_NAME + symbol + "." + JSSharedData.SYMBOL_INSTANCE + " = new " + JSSharedData.ROOT_NAME + symbol + "();\n"); - } - } - } - - // support for generating test cases for JsTestDriver. - // see http://code.google.com/p/js-test-driver/wiki/TestCase - /* - * private void emitTestCase(String topLevelClass) { if( - * JSSharedData.GENERATE_TEST_CASE && topLevelClass != null ) { // support - * for [TestCase(name="...")] String testCaseName = topLevelClass; - * ASProjectScope projectScope = (ASProjectScope)m_project.getScope(); - * IDefinition rootClassDef = - * projectScope.findDefinitionByName(topLevelClass); if (rootClassDef != - * null) { final IMetaTag testCaseTag = - * rootClassDef.getMetaTagByName(JSSharedData.TESTCASE_METATAG ); - * if(testCaseTag!= null) { final String testCaseAttr = - * testCaseTag.getAttributeValue("name"); if( testCaseAttr != null && - * !testCaseAttr.isEmpty() ) testCaseName = testCaseAttr; } } writeString( - * "\n" ); writeString( "\t// Create and export " + - * JSSharedData.JS_FRAMEWORK_NAME + ".mainTestCase\n" ); writeString( - * "\tif(typeof(TestCase) != \"undefined\")\n" ); writeString( "\t{\n" ); - * writeString( "\t\tadobe.mainTestCase = TestCase(\"" + testCaseName + - * "\");\n" ); writeString( - * "\t\tadobe.mainTestCase.prototype.testMain = function()\n" ); - * writeString( "\t\t{\n" ); if( JSSharedData.MAIN != null ) { writeString( - * "\t\t\tconsole.info(\"Running " + JSSharedData.MAIN + "() ...\")\n" ); - * writeString( "\t\t\t" + JSSharedData.MAIN + "();\n" ); } else { - * writeString( "\t\t\tconsole.info(\"Running " + testCaseName + " ...\")\n" - * ); writeString( "\t\t\tnew " + topLevelClass + "();\n" ); } writeString( - * "\t\t}\n" ); writeString( "\t\tgoog.exportSymbol( \"" + - * JSSharedData.JS_FRAMEWORK_NAME + ".mainTestCase\", " + - * JSSharedData.JS_FRAMEWORK_NAME + ".mainTestCase );\n" ); writeString( - * "\t\tgoog.exportSymbol( \"" + JSSharedData.JS_FRAMEWORK_NAME + - * ".mainTestCase.prototype.testMain\", " + JSSharedData.JS_FRAMEWORK_NAME + - * ".mainTestCase.prototype.testMain );\n" ); writeString( "\t}\n" ); } } - */ - protected void writePrologue(Boolean createSharedLib) - { - if (createSharedLib) - { - writeString("/**\n"); - writeString(" * @const\n"); - writeString(" * @type {function()}\n"); - writeString(" */\n"); - writeString("var __libInit = function(__global, __adobe) {\n"); - } - else if (JSSharedData.GENERATE_TEST_CASE) - { - // ensure there is always a TestCase. - String testCaseName; - String topLevelClass = getTopLevelClass(); - if (topLevelClass == null) - { - final Date now = new Date(); - testCaseName = topLevelClass = "Test_" + now.getTime(); - } - else - { - testCaseName = topLevelClass; - final ASProjectScope projectScope = (ASProjectScope)m_project.getScope(); - final IDefinition rootClassDef = projectScope.findDefinitionByName(topLevelClass); - if (rootClassDef != null) - { - final IMetaTag testCaseTag = rootClassDef.getMetaTagByName(JSSharedData.TESTCASE_METATAG); - if (testCaseTag != null) - { - final String testCaseAttr = testCaseTag.getAttributeValue("name"); - if (testCaseAttr != null && !testCaseAttr.isEmpty()) - testCaseName = testCaseAttr; - } - } - } - - // TODO: emit type annotations for Google's closure compiler. - writeString("var __global = this;\n"); - - writeString("/**\n"); - writeString(" * @const\n"); - writeString(" * @typedef {string}\n"); - writeString(" */\n"); - writeString("var testCaseName = \"" + testCaseName + "\";\n"); - writeString("\n"); - - writeString("/**\n"); - writeString(" * @const\n"); - writeString(" * @typedef {boolean}\n"); - writeString(" */\n"); - writeString("var hasTestCase = typeof(TestCase) != \"undefined\";\n"); - writeString("\n"); - - writeString("/**\n"); - writeString(" * @const\n"); - writeString(" * @type {array}\n"); - writeString(" */\n"); - writeString("var __testCases = [];\n"); - - writeString("/**\n"); - writeString(" * @const\n"); - writeString(" * @type {function()}\n"); - writeString(" */\n"); - writeString("var __runTestCases = function()\n"); - writeString("{\n"); - writeString("\tif(hasTestCase)\n"); - writeString("\t\treturn;\n\n"); - writeString("\twhile( __testCases.length > 0 )\n"); - writeString("\t{\n"); - writeString("\t\tvar tc = __testCases.shift();\n"); - writeString("\t\tfor( var method in tc )\n"); - writeString("\t\t{\n"); - writeString("\t\t\tif( method.substring(0,4) == \"test\" )\n"); - writeString("\t\t\t\ttc[method]();\n"); - writeString("\t\t}\n"); - writeString("\t}\n"); - writeString("}\n"); - - writeString("/**\n"); - writeString(" * @const\n"); - writeString(" * @type {function(...)}\n"); - writeString(" */\n"); - writeString("var TestCase = hasTestCase ? TestCase : (function(name,testcase)\n"); - writeString("\t{\n"); - writeString("\t\tvar tc = testcase;\n"); - writeString("\t\tif( tc )\n"); - writeString("\t\t{\n"); - writeString("\t\t\t__testCases.push(tc);\n"); - writeString("\t\t}\n"); - writeString("\t\telse\n"); - writeString("\t\t{\n"); - writeString("\t\t\ttc = function(){};\n"); - writeString("\t\t\t __testCases.push(new tc());\n"); - writeString("\t\t}\n"); - writeString("\t\treturn tc;\n"); - writeString("\t});\n"); - - writeString("\n"); - writeString("/**\n"); - writeString(" * @const\n"); - writeString(" * @type {function(...)}\n"); - writeString(" */\n"); - writeString("var AsyncTestCase = hasTestCase ? AsyncTestCase : TestCase;\n"); - - writeString("\n"); - writeString("/**\n"); - writeString(" * @const\n"); - writeString(" * @type {function(...)}\n"); - writeString(" */\n"); - writeString("var MainTestCase = TestCase(testCaseName);\n"); - writeString("MainTestCase.prototype.testMain = function() {\n"); - writeString("console.info(\"START TEST: \" + testCaseName );\n"); - writeString("(function(__global) {\n"); - } - else - { - writeString("(function(__global) {\n"); - } - } - - protected void writeEpilogue(Boolean createSharedLib) - { - if (createSharedLib) - { - writeString("}; // __libInit() \n\n"); - writeString("goog.exportSymbol( \"__libInit\", __libInit);\n"); - } - else if (JSSharedData.GENERATE_TEST_CASE) - { - writeString("})(__global);\n"); - writeString("console.info(\"END TEST: \" + testCaseName );\n"); - writeString("} // MainTestCase.prototype.testMain \n\n"); - - writeString("goog.exportSymbol( \"MainTestCase\", MainTestCase);\n"); - writeString("goog.exportSymbol( \"MainTestCase.prototype.testMain\", MainTestCase.prototype.testMain);\n"); - - writeString("__runTestCases();\n"); - } - else - { - writeString("})(this);\n"); - } - } - - protected void writeFinalize(Boolean createSharedLib) - { - writeString("\n"); - - // ASProjectScope projectScope = applicationProject.getScope(); - // IDefinition rootClassDef = projectScope.findDefinitionByName(getTopLevelClass()); - - // export toplevel class - - // support for no export - final String topLevelClass = getTopLevelClass(); - if (topLevelClass != null && !JSSharedData.NO_EXPORTS) - { - writeString("// Top Level Class\n"); - writeString("goog.exportSymbol(\"" + JSSharedData.ROOT_NAME + topLevelClass + "\", " - + JSSharedData.ROOT_NAME + topLevelClass + ");\n"); - writeString("// Export " + JSSharedData.JS_FRAMEWORK_NAME + ".createStage\n"); - writeString("goog.exportSymbol( \"" + JSSharedData.JS_FRAMEWORK_NAME + ".createStage\", " + JSSharedData.JS_FRAMEWORK_NAME + ".createStage );\n\n"); - } - - final String finalize = "staticInits"; - - // generated finalize() function - writeString("/** \n"); - writeString(" * Generated finalizer.\n"); - writeString(" * @param {DOMWindow} global Global object\n"); - writeString(" * @param {" + JSSharedData.ROOT_NAME + "browser.IFramework} framework Framework to use\n"); - writeString(" */\n"); - writeString(JSSharedData.JS_FRAMEWORK_NAME + "." + finalize + " = function(global,framework)\n"); - writeString("{\n"); - writeString("\tadobe.globals = global;\n"); - writeString("\tadobe.m_framework = framework;\n"); - - writeString("\tadobe.uintClass = UIntClass;\n"); - writeString("\tadobe.intClass = IntClass;\n"); - - emitSettings(); - // emitExports(); - // emitClassInfo(); - emitInterfacesInfo(); - // emitStaticInits(); - emitSymbolInstances(); - // emitTestCase(topLevelClass); - writeString("}\n\n"); - - // select framework - writeString("/** \n"); - writeString(" * Selected framework, i.e. JQueryFramework, or GoogleFramework\n"); - writeString(" * @typedef {" + JSSharedData.ROOT_NAME + "browser.IFramework}\n"); - writeString(" */\n"); - writeString("var framework = new " + JSSharedData.ROOT_NAME + JSSharedData.FRAMEWORK_CLASS + "();\n\n"); - - // call finalize() - writeString("// Call static initialization chain\n"); - writeString(JSSharedData.JS_FRAMEWORK_NAME + "." + finalize + "(goog.global,framework);\n\n"); - - emitScriptInfos(); - - // support for no export - if (!createSharedLib) - { - if (JSSharedData.MAIN != null) - { - writeString("// Main entry point: " + JSSharedData.MAIN + "\n"); - writeString(JSSharedData.MAIN + "();\n\n"); - } - else if (topLevelClass != null) - { - if (hasStage) - { - writeString("// Main entry point: wrapper for adding " + topLevelClass + " to the stage.\n"); - writeString("function main()\n"); - writeString("{\n"); - writeString("\t/** @type {flash.display.Stage} */\n"); - writeString("\tvar stage /* : Stage */ = flash.display.Stage.instance();\n"); - writeString("\t/** @type {flash.display.DisplayObject} */\n"); - writeString("\tvar sprite /* : DisplayObject */ = (new " + JSSharedData.ROOT_NAME + topLevelClass + "());\n"); - writeString("\tstage.addChild(sprite);\n"); - writeString("}\n\n"); - - writeString("// Delay creation of " + topLevelClass + "\n"); - writeString("document.addEventListener( \"DOMContentLoaded\", main, false );\n\n"); - } - else - { - writeString("// Main entry point: wrapper for creating " + topLevelClass + "\n"); - writeString("\t/** @type {flash.display.DisplayObject} */\n"); - writeString("\tvar sprite /* : DisplayObject */ = (new " + JSSharedData.ROOT_NAME + topLevelClass + "());\n"); - } - } - } - } - - // see http://blog.bolinfest.com/2009/11/calling-closure-compiler-from-java.html - private void optimize(OutputBitStream outputbuffer, Boolean createSharedLib) throws IOException - { - /* - * <arg value="--compilation_level=ADVANCED_OPTIMIZATIONS"/> <arg value= - * "--externs=${falcon-sdk}/lib/google/closure-compiler/contrib/externs/jquery-1.5.js" - * /> <arg value= - * "--externs=${falcon-sdk}/lib/google/closure-compiler/contrib/externs/svg.js" - * /> <arg value= - * "--externs=${falcon-sdk}/lib/google/closure-compiler/contrib/externs/jsTestDriver.js" - * /> <arg value="--formatting=PRETTY_PRINT"/> <arg - * value="--js=${falcon-sdk}/frameworks/javascript/goog/base.js"/> <arg - * value="--js=${build.target.js}"/> <arg - * value="--js_output_file=${build.target.compiled.js}"/> <arg - * value="--create_source_map=${build.target.compiled.map}"/> - */ - String code = new String(outputbuffer.getBytes()); - code = code.substring(0, outputBuffer.size()); - Compiler compiler = new Compiler(); - - CompilerOptions options = new CompilerOptions(); - - if (JSSharedData.CLOSURE_compilation_level.equals("ADVANCED_OPTIMIZATIONS")) - CompilationLevel.ADVANCED_OPTIMIZATIONS.setOptionsForCompilationLevel(options); - else if (createSharedLib && JSSharedData.instance.hasAnyEncryptedJS()) - CompilationLevel.SIMPLE_OPTIMIZATIONS.setOptionsForCompilationLevel(options); - else if (JSSharedData.CLOSURE_compilation_level.equals("WHITESPACE_ONLY")) - CompilationLevel.WHITESPACE_ONLY.setOptionsForCompilationLevel(options); - else - CompilationLevel.SIMPLE_OPTIMIZATIONS.setOptionsForCompilationLevel(options); - - String sdkPath = null; - if (JSSharedData.CLOSURE_externs == null || JSSharedData.CLOSURE_js == null) - { - sdkPath = JSSharedData.SDK_PATH; - } - - // To get the complete set of externs, the logic in - // CompilerRunner.getDefaultExterns() should be used here. - final List<JSSourceFile> extern = CommandLineRunner.getDefaultExterns(); - if (JSSharedData.CLOSURE_externs != null) - { - for (String externsFile : JSSharedData.CLOSURE_externs) - extern.add(JSSourceFile.fromFile(externsFile)); - } - else if (sdkPath != null) - { - /* - * <arg value= - * "--externs=${falcon-sdk}/lib/google/closure-compiler/contrib/externs/jquery-1.5.js" - * /> <arg value= - * "--externs=${falcon-sdk}/lib/google/closure-compiler/contrib/externs/svg.js" - * /> <arg value= - * "--externs=${falcon-sdk}/lib/google/closure-compiler/contrib/externs/jsTestDriver.js" - * /> - */ - extern.add(JSSourceFile.fromFile(sdkPath + "/lib/google/closure-compiler/contrib/externs/svg.js")); - if (JSSharedData.FRAMEWORK_CLASS.equals("browser.JQueryFramework")) - extern.add(JSSourceFile.fromFile(sdkPath + "/lib/google/closure-compiler/contrib/externs/jquery-1.5.js")); - if (JSSharedData.GENERATE_TEST_CASE) - extern.add(JSSourceFile.fromFile(sdkPath + "/lib/google/closure-compiler/contrib/externs/jsTestDriver.js")); - } - - final List<JSSourceFile> input = new ArrayList<JSSourceFile>(); - if (JSSharedData.CLOSURE_js != null) - { - for (String inputFile : JSSharedData.CLOSURE_js) - input.add(JSSourceFile.fromFile(inputFile)); - } - else if (sdkPath != null) - { - // <arg value="--js=${falcon-sdk}/frameworks/javascript/goog/base.js"/> - input.add(JSSourceFile.fromFile(sdkPath + "/frameworks/javascript/goog/base.js")); - } - - // The dummy input name "input.js" is used here so that any warnings or - // errors will cite line numbers in terms of input.js. - input.add(JSSourceFile.fromCode("input.js", code.toString())); - // input.add( JSSourceFile.fromCode("input.js", "/** @preserve CROSS-COMPILED BY FALCONJS (320588.13) ON 2011-09-09 22:18:10 */\nvar __global = this;\n") ); - - if (JSSharedData.CLOSURE_create_source_map != null) - options.sourceMapOutputPath = JSSharedData.CLOSURE_create_source_map; - - if (JSSharedData.CLOSURE_formatting != null) - { - if (JSSharedData.CLOSURE_formatting.equals("PRETTY_PRINT")) - options.prettyPrint = true; - else if (JSSharedData.CLOSURE_formatting.equals("PRINT_INPUT_DELIMITER")) - options.prettyPrint = true; - else - throw new RuntimeException("Unknown formatting option: " + JSSharedData.CLOSURE_formatting); - } - else if (JSSharedData.DEBUG) - { - options.prettyPrint = true; - } - - // turn off closure's logger depending on verbose mode. - if (!JSSharedData.instance.isVerbose()) - { - final Logger logger = Logger.getLogger("com.google.javascript.jscomp"); - logger.setLevel(Level.OFF); - } - - try - { - // compile() returns a Result, but it is not needed here. - compiler.compile(extern, input, options); - - if (compiler.getErrorCount() == 0) - { - // The compiler is responsible for generating the compiled code; it is not - // accessible via the Result. - final String optimizedCode = compiler.toSource(); - outputbuffer.reset(); - outputbuffer.write(optimizedCode.getBytes()); - } - else if (m_problems != null) - { - final JSError[] errors = compiler.getErrors(); - for (JSError err : errors) - m_problems.add(new ClosureProblem(err)); - } - } - - /* - * internal compiler error generated with optimize enabled compiling - * as3_enumerate.fla and fails to release the JS file - * http://watsonexp.corp.adobe.com/#bug=3047880 This is part #3 of the - * fix: The closure compiler throws RTEs on internal compiler errors, - * that don't get caught until they bubble up to MXMLJSC's scope. On - * their way out files remain unclosed and cause problems, because Flame - * cannot delete open files. The change below addresses this problem. - */ - catch (RuntimeException rte) - { - if (m_problems != null) - { - final ICompilerProblem problem = new InternalCompilerProblem(rte); - m_problems.add(problem); - } - } - } - - /** - * {@inherit} - */ - @Override - public int writeTo(File outputFile) throws FileNotFoundException, IOException - { - return 0; - } - - public class ClosureProblem implements ICompilerProblem - { - private JSError m_error; - - public ClosureProblem(JSError error) - { - m_error = error; - } - - /** - * Returns a unique identifier for this type of problem. - * <p> - * Clients can use this identifier to look up, in a .properties file, a - * localized template string describing the problem. The template string - * can have named placeholders such as ${name} to be filled in, based on - * correspondingly-named fields in the problem instance. - * <p> - * Clients can also use this identifier to decide whether the problem is - * an error, a warning, or something else; for example, they might keep - * a list of error ids and a list of warning ids. - * <p> - * The unique identifier happens to be the fully-qualified classname of - * the problem class. - * - * @return A unique identifier for the type of problem. - */ - public String getID() - { - // Return the fully-qualified classname of the CompilerProblem subclass - // as a String to identify the type of problem that occurred. - return getClass().getName(); - } - - /** - * Gets the path of the file in which the problem occurred. - * - * @return The path of the source file, or null if unknown. - */ - public String getFilePath() - { - return m_error.sourceName; - } - - /** - * Gets the offset within the source buffer at which the problem starts. - * - * @return The starting offset, or -1 if unknown. - */ - public int getStart() - { - return m_error.getCharno(); - } - - /** - * Gets the offset within the source buffer at which the problem ends. - * - * @return The ending offset, or -1 if unknown. - */ - public int getEnd() - { - return -1; - } - - /** - * Gets the line number within the source buffer at which the problem - * starts. Line numbers start at 0, not 1. - * - * @return The line number, or -1 if unknown. - */ - public int getLine() - { - return m_error.lineNumber; - } - - /** - * Gets the column number within the source buffer at which the problem - * starts. Column numbers start at 0, not 1. - * - * @return The column number, of -1 if unknown. - */ - public int getColumn() - { - return -1; - } - - /** - * Returns a readable description of the problem, by substituting field - * values for named placeholders such as ${name} in the localized - * template. - * - * @param template A localized template string describing the problem, - * determined by the client from the problem ID. If this parameter is - * null, an English template string, stored as the DESCRIPTION of the - * problem class, will be used. - * @return A readable description of the problem. - */ - public String getDescription(String template) - { - return m_error.description; - } - - /** - * Compares this problem to another problem by path, line, and column so - * that problems can be sorted. - */ - final public int compareTo(final ICompilerProblem other) - { - if (getFilePath() != null && other.getSourcePath() != null) - { - final int pathCompare = getFilePath().compareTo(other.getSourcePath()); - if (pathCompare != 0) - return pathCompare; - } - else if (getFilePath() != null && other.getSourcePath() == null) - { - return 1; - } - else if (getFilePath() == null && other.getSourcePath() != null) - { - return -1; - } - - if (getLine() < other.getLine()) - return -1; - else if (getLine() > other.getLine()) - return 1; - - if (getColumn() < other.getColumn()) - return -1; - else if (getColumn() > other.getColumn()) - return 1; - - return 0; - } - - public int getAbsoluteEnd() - { - // TODO Auto-generated method stub - return 0; - } - - public int getAbsoluteStart() - { - // TODO Auto-generated method stub - return 0; - } - - public String getSourcePath() - { - // TODO Auto-generated method stub - return null; - } - - } -}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/cmc-js.jbg ---------------------------------------------------------------------- diff --git a/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/cmc-js.jbg b/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/cmc-js.jbg deleted file mode 100644 index c1e7830..0000000 --- a/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/cmc-js.jbg +++ /dev/null @@ -1,328 +0,0 @@ -/* - * - * 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. - * - */ - -/** - * cmc-js.jbg mirrors cmc.jbg and contains FalconJS's definitions for JBurg. - * - * After making changes to cmc-js.jbg or JSCmcRules.jbg you need to run this command - * in the ./compiler/trunk folder: - * - * ant -f build-js.xml - * - * This implementation is part of FalconJS. - * For more details on FalconJS see org.apache.flex.compiler.JSDriver. - * - */ - -package org.apache.flex.compiler.internal.as.codegen; - -header -{ - import org.apache.flex.compiler.problems.ICompilerProblem; - import org.apache.flex.compiler.problems.*; - - import static org.apache.flex.abc.ABCConstants.*; - - import org.apache.flex.abc.semantics.Label; - import org.apache.flex.abc.semantics.Name; - import org.apache.flex.abc.semantics.Namespace; - import org.apache.flex.abc.instructionlist.InstructionList; - - import org.apache.flex.compiler.constants.IASLanguageConstants; - - import org.apache.flex.compiler.tree.ASTNodeID; - import static org.apache.flex.compiler.tree.ASTNodeID.*; - - import org.apache.flex.compiler.internal.semantics.SemanticUtils; - - import org.apache.flex.compiler.tree.as.IASNode; - import org.apache.flex.compiler.tree.as.ITryNode; - - import org.apache.flex.abc.semantics.ECMASupport; -} - -INodeType IASNode; -OpcodeType ASTNodeID; - -/* - * The I-node type is IASNode, and it has its own adapter. - */ -INodeAdapter org.apache.flex.compiler.internal.as.codegen.IASNodeAdapter; - -// Generate Java output. -Language java; - -ReturnType String; -ReturnType InstructionList = String; - -ReturnType name = Binding; -ReturnType type_name = Binding; -ReturnType decl_name = Name; -ReturnType new_type_name = Binding; -ReturnType qualifiedName = Binding; -ReturnType qualifiedNamePart = String; -ReturnType return_type_name = Binding; - -ReturnType dottedNamePart = String; - -ReturnType conditionalElements = JSGeneratingReducer.ConditionalFragment; - -ReturnType ifElseIf = JSGeneratingReducer.ConditionalFragment; - -ReturnType catch_block = JSGeneratingReducer.CatchPrototype; - -ReturnType integer_constant = Integer; -ReturnType uint_constant = Long; -ReturnType double_constant = Double; -ReturnType string_constant = String; -ReturnType boolean_constant = Boolean; -ReturnType float_constant = Float; - -ReturnType numeric_constant = Number; - -ReturnType constant_value = Object; -ReturnType required_constant_value = Object; - -ReturnType non_resolving_identifier = String; - -ReturnType runtime_name_expression = JSGeneratingReducer.RuntimeMultiname; -ReturnType multinameL = Name; -ReturnType stmt_label = String; -ReturnType e4x_literal = String; - -JBurg.Constant ERROR_TRAP = 268435456; - -{ - final static boolean NEED_VALUE = true; - final static boolean DISCARD_VALUE = false; - - - /** - * The reducer has all the implementation - * logic for the rewrite; the BURM constructed - * by this specification drives that logic. - */ - JSGeneratingReducer reducer; - - /** - * Delegate calls to pushNumericConstant to the reducer. - * This routine is called from other parts of the code generator, - * so it's necessary to keep this layer of indirection. - */ - public static void pushNumericConstant(long value, String result_list) - { - JSGeneratingReducer.pushNumericConstant(value, result_list); - } - - /* - * ** Cost functions ** - */ - - - /** - * @return "feasible" if the reducer can reduce this to a dotted name. - */ - int isDottedName(IASNode iNode) - { - return reducer.isDottedName(iNode); - } - - /** - * @return "feasible" if the reducer can reduce this to a dotted name. - */ - int isPackageName(IASNode iNode) - { - return reducer.isPackageName(iNode); - } - - /** - * @return "feasible" if this node's qualifier is a compile-time constant. - */ - int qualifierIsCompileTimeConstant(IASNode iNode) - { - return reducer.qualifierIsCompileTimeConstant(iNode); - } - - /** - /** - * @return "feasible" if this node's qualifier is an interface. - */ - int qualifierIsInterface(IASNode iNode) - { - return reducer.qualifierIsInterface(iNode); - } - - /** - * @return "feasible" if this node can be resolved to a compile-time constant. - */ - int isCompileTimeConstant(IASNode iNode) - { - return reducer.isCompileTimeConstant(iNode); - } - - /** - * @return "feasible" if this function call node can be resolved to a compile-time constant function. - */ - int isCompileTimeConstantFunction(IASNode iNode) - { - return reducer.isCompileTimeConstantFunction(iNode); - } - - /** - * @return "feasible" if this node is for 'new Array()'. - */ - int isEmptyArrayConstructor(IASNode iNode) - { - return reducer.isEmptyArrayConstructor(iNode); - } - - /** - * @return "feasible" if this node is for 'new Object()'. - */ - int isEmptyObjectConstructor(IASNode iNode) - { - return reducer.isEmptyObjectConstructor(iNode); - } - - /** - * @return "feasible" if this node is "super(this)". - */ - int isSuperThisForFieldAccess(IASNode iNode) - { - return SemanticUtils.isSuperThisForFieldAccess(iNode); - } - - /** - * @return "feasible" if the base and parameter types of - * a parameterized type are both known types. - */ - int parameterTypeIsConstant(IASNode iNode) - { - return reducer.parameterTypeIsConstant(iNode); - } - - /** - * @return "feasible" if a standalone "super" expression is in a parameter list. - */ - int isValidStandaloneSuper(IASNode iNode) - { - return /* SemanticUtils.isValidStandaloneSuper(iNode)? 1: */ Integer.MAX_VALUE; - } - - /** - * @return "feasible" if this node resolves to a type definition. - */ - int isKnownType(IASNode iNode) - { - return reducer.isKnownType(iNode); - } - - /* - * ****************************** - * ** IASNodeAdapter Support ** - * ****************************** - */ - /** - * Get the default child of a node type that requires special handling. - * @param parent - the child's parent node. - * @param index - the desired child. - * @return the child at the specified (abstract) index, or null - * if no such child exists. - */ - public static IASNode getDefaultChild(IASNode parent, int index) - { - switch(parent.getNodeID()) - { - case VariableID: - case BindableVariableID: - { - // Look for chained variable definitions. - IASNode candidate = parent.getChild(index); - - if ( candidate != null ) - { - ASTNodeID candidateID = candidate.getNodeID(); - if( candidateID == VariableID || candidateID == BindableVariableID ) - { - return candidate; - } - } - return null; - } - - case Op_CommaID: - return parent.getChild(index-1); - - case FunctionID: - case GetterID: - case SetterID: - return null; - - case TryID: - { - // Note: If the try has a contents and finally nodes, - // they are presented to the CG by getNthChild() as child - // nodes 0 and 1 before the n-ary tail of catch nodes. - if (((ITryNode)parent).getStatementContentsNode() != null) - index--; - if (((ITryNode)parent).getFinallyNode() != null) - index--; - return ((ITryNode)parent).getCatchNode(index); - } - default: - return parent.getChild(index); - } - } - - /** - * recordError is a convenience method for error reductions; - * it adds a problem to the current set of problems and - * returns an empty String. - * @return an empty String. - */ - String recordError(ICompilerProblem problem) - { - reducer.getProblems().add(problem); - return ""; - } -} - -/* - * Error recovery routine: deduce what we can from the problem - * tree, then abort this BURM with an exception that the caller - * can catch and ignore. - */ - -/* -bparadie, 2011-12-01: Tom recommends not using DefaultErrorHandler at all. - -DefaultErrorHandler -{ - new UnknownTreeHandler(reducer.getProblems()).analyze(p); - throw new BURMAbortException(); -} -*/ - -/* - * Patterns and rules are stored in their own, shareable file. - */ -JBurg.include "../../../../../../../../../compiler/src/org/apache/flex/compiler/internal/as/codegen/CmcPatterns.jbg" -JBurg.include "../../../../../../../../../compiler/src/org/apache/flex/compiler/internal/as/codegen/CmcRules.jbg" -JBurg.include "../../../../../../../../../compiler/src/org/apache/flex/compiler/internal/as/codegen/SemanticErrors.jbg" - http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler.js/src/org/apache/flex/compiler/internal/driver/IBackend.java ---------------------------------------------------------------------- diff --git a/compiler.js/src/org/apache/flex/compiler/internal/driver/IBackend.java b/compiler.js/src/org/apache/flex/compiler/internal/driver/IBackend.java deleted file mode 100644 index 2985c1f..0000000 --- a/compiler.js/src/org/apache/flex/compiler/internal/driver/IBackend.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * - * 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.driver; - -import java.util.Collection; -import java.util.List; - -import org.apache.flex.abc.visitors.IABCVisitor; -import org.apache.flex.compiler.config.Configurator; -import org.apache.flex.compiler.internal.as.codegen.CmcJSEmitter; -import org.apache.flex.compiler.internal.as.codegen.InterfaceDirectiveProcessor; -import org.apache.flex.compiler.internal.as.codegen.JSEmitter; -import org.apache.flex.compiler.internal.as.codegen.JSGeneratingReducer; -import org.apache.flex.compiler.internal.as.codegen.JSGenerator; -import org.apache.flex.compiler.internal.as.codegen.JSGlobalDirectiveProcessor; -import org.apache.flex.compiler.internal.as.codegen.JSClassDirectiveProcessor; -import org.apache.flex.compiler.internal.as.codegen.JSWriter; -import org.apache.flex.compiler.internal.as.codegen.LexicalScope; -import org.apache.flex.compiler.internal.projects.CompilerProject; -import org.apache.flex.compiler.internal.projects.ISourceFileHandler; -import org.apache.flex.compiler.internal.tree.as.ClassNode; -import org.apache.flex.compiler.internal.tree.as.InterfaceNode; -import org.apache.flex.compiler.problems.ICompilerProblem; -import org.apache.flex.compiler.projects.ICompilerProject; -import org.apache.flex.compiler.targets.ISWFTarget; -import org.apache.flex.compiler.targets.ITargetProgressMonitor; -import org.apache.flex.compiler.targets.ITargetSettings; -import org.apache.flex.compiler.units.ICompilationUnit; -import org.apache.flex.swf.ISWF; -import org.apache.flex.swf.io.ISWFWriter; - -public interface IBackend -{ - // called by MXMLJSC - public Configurator createConfigurator(); - - public ISWFWriter createSWFWriter(ICompilerProject project, List<ICompilerProblem> problems, ISWF swf, boolean useCompression, boolean enableDebug); - - public JSWriter createJSWriter(ICompilerProject project, List<ICompilerProblem> problems, Collection<ICompilationUnit> compilationUnits, boolean useCompression); - - public ISWFTarget createSWFTarget(CompilerProject project, ITargetSettings targetSettings, ITargetProgressMonitor progressMonitor) throws InterruptedException; - - public ISourceFileHandler getSourceFileHandlerInstance(); - - // TODO: can all reducers be derived from IGenerator? - // called by JSCompilationUnit. - public JSGenerator createGenerator(); - - // called by JSGenerator. - public JSEmitter createEmitter(ICompilationUnit.Operation buildPhase, ICompilerProject project, JSGenerator generator); - - // TODO: can all reducers be derived from ICmcEmitter? - // called by JSGenerator. - public CmcJSEmitter createCmcJSEmitter(); - - // TODO: can all reducers be derived from IReducer? - // called by JSGenerator. - public JSGeneratingReducer createReducer(); - - // TODO: GlobalDirectiveProcessor is not visible - // called by JSGenerator. - public JSGlobalDirectiveProcessor createGlobalDirectiveProcessor(JSGenerator generator, LexicalScope current_scope, IABCVisitor emitter); - - // TODO: ClassDirectiveProcessor is not visible - public JSClassDirectiveProcessor createClassDirectiveProcessor(JSGenerator generator, ClassNode c, LexicalScope enclosing_scope, IABCVisitor emitter); - - public InterfaceDirectiveProcessor createInterfaceDirectiveProcessor(JSGenerator jsGenerator, InterfaceNode in, LexicalScope enclosing_scope, IABCVisitor emitter); - - public RuntimeException createException(String msg); - - public String getOutputExtension(); -} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler.js/src/org/apache/flex/compiler/internal/driver/JSBackend.java ---------------------------------------------------------------------- diff --git a/compiler.js/src/org/apache/flex/compiler/internal/driver/JSBackend.java b/compiler.js/src/org/apache/flex/compiler/internal/driver/JSBackend.java deleted file mode 100644 index b081721..0000000 --- a/compiler.js/src/org/apache/flex/compiler/internal/driver/JSBackend.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * - * 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.driver; - -import java.util.Collection; -import java.util.List; - -import org.apache.flex.abc.visitors.IABCVisitor; -import org.apache.flex.compiler.clients.JSCommandLineConfiguration; -import org.apache.flex.compiler.config.Configurator; -import org.apache.flex.compiler.internal.as.codegen.CmcJSEmitter; -import org.apache.flex.compiler.internal.as.codegen.InterfaceDirectiveProcessor; -import org.apache.flex.compiler.internal.as.codegen.JSEmitter; -import org.apache.flex.compiler.internal.as.codegen.JSGeneratingReducer; -import org.apache.flex.compiler.internal.as.codegen.JSGenerator; -import org.apache.flex.compiler.internal.as.codegen.JSGlobalDirectiveProcessor; -import org.apache.flex.compiler.internal.as.codegen.JSClassDirectiveProcessor; -import org.apache.flex.compiler.internal.as.codegen.JSInterfaceDirectiveProcessor; -import org.apache.flex.compiler.internal.as.codegen.JSSharedData; -import org.apache.flex.compiler.internal.as.codegen.JSWriter; -import org.apache.flex.compiler.internal.as.codegen.LexicalScope; -import org.apache.flex.compiler.internal.projects.CompilerProject; -import org.apache.flex.compiler.internal.projects.ISourceFileHandler; -import org.apache.flex.compiler.internal.tree.as.ClassNode; -import org.apache.flex.compiler.internal.tree.as.InterfaceNode; -import org.apache.flex.compiler.problems.ICompilerProblem; -import org.apache.flex.compiler.projects.ICompilerProject; -import org.apache.flex.compiler.targets.ISWFTarget; -import org.apache.flex.compiler.targets.ITargetProgressMonitor; -import org.apache.flex.compiler.targets.ITargetSettings; -import org.apache.flex.compiler.units.ICompilationUnit; -import org.apache.flex.swf.ISWF; -import org.apache.flex.swf.io.ISWFWriter; - -public class JSBackend implements IBackend -{ - // called by MXMLJSC - public Configurator createConfigurator() - { - return new Configurator(JSCommandLineConfiguration.class); - } - - public ISWFWriter createSWFWriter(ICompilerProject project, List<ICompilerProblem> problems, ISWF swf, boolean useCompression, boolean enableDebug) - { - return new JSWriter(project, problems, swf, useCompression, enableDebug); - } - - public JSWriter createJSWriter(ICompilerProject project, List<ICompilerProblem> problems, Collection<ICompilationUnit> compilationUnits, boolean useCompression) - { - return new JSWriter(project, problems, compilationUnits, useCompression); - } - - public ISWFTarget createSWFTarget(CompilerProject project, ITargetSettings targetSettings, ITargetProgressMonitor progressMonitor) throws InterruptedException - { - // see FlexProject::createSWFTarget() - return new JSTarget(project, targetSettings, progressMonitor); - } - - public ISourceFileHandler getSourceFileHandlerInstance() - { - return JSSourceFileHandler.INSTANCE; - } - - // TODO: can all reducers be derived from IGenerator? - // called by JSCompilationUnit. - public JSGenerator createGenerator() - { - return new JSGenerator(); - } - - // called by JSGenerator. - public JSEmitter createEmitter(ICompilationUnit.Operation buildPhase, ICompilerProject project, JSGenerator generator) - { - return new JSEmitter(JSSharedData.instance, buildPhase, project, generator); - } - - // TODO: can all reducers be derived from ICmcEmitter? - // called by JSGenerator. - public CmcJSEmitter createCmcJSEmitter() - { - return new CmcJSEmitter(); - } - - // TODO: can all reducers be derived from IReducer? - // called by JSGenerator. - public JSGeneratingReducer createReducer() - { - return new JSGeneratingReducer(JSSharedData.instance); - } - - // TODO: GlobalDirectiveProcessor is not visible - // called by JSGenerator. - public JSGlobalDirectiveProcessor createGlobalDirectiveProcessor(JSGenerator generator, LexicalScope current_scope, IABCVisitor emitter) - { - return new JSGlobalDirectiveProcessor(generator, current_scope, emitter); - } - - // TODO: ClassDirectiveProcessor is not visible - public JSClassDirectiveProcessor createClassDirectiveProcessor(JSGenerator generator, ClassNode c, LexicalScope enclosing_scope, IABCVisitor emitter) - { - return new JSClassDirectiveProcessor(generator, c, enclosing_scope, emitter); - } - - public InterfaceDirectiveProcessor createInterfaceDirectiveProcessor(JSGenerator generator, InterfaceNode in, LexicalScope enclosing_scope, IABCVisitor emitter) - { - return new JSInterfaceDirectiveProcessor(generator, in, enclosing_scope, emitter); - } - - public RuntimeException createException(String msg) - { - return new RuntimeException(msg); - } - - public String getOutputExtension() - { - return "js"; - } -}