You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by cd...@apache.org on 2016/04/13 20:55:55 UTC

[03/51] [partial] git commit: [flex-falcon] [refs/heads/feature/maven-migration-test] - - Check-In of the migrated project to make error analysis easier

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";
-    }
-}