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/11/05 07:48:11 UTC

[06/15] git commit: [flex-falcon] [refs/heads/develop] - - Greatly worked on cleaning up the compiler code

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/3724c2ff/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/vf2js/MXMLVF2JSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/vf2js/MXMLVF2JSEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/vf2js/MXMLVF2JSEmitter.java
deleted file mode 100644
index 6e2dfba..0000000
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/vf2js/MXMLVF2JSEmitter.java
+++ /dev/null
@@ -1,1589 +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.codegen.mxml.vf2js;
-
-
-import java.io.FilterWriter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.apache.flex.abc.semantics.MethodInfo;
-import org.apache.flex.abc.semantics.Name;
-import org.apache.flex.abc.semantics.Namespace;
-import org.apache.flex.compiler.codegen.as.IASEmitter;
-import org.apache.flex.compiler.codegen.mxml.flexjs.IMXMLFlexJSEmitter;
-import org.apache.flex.compiler.definitions.IClassDefinition;
-import org.apache.flex.compiler.definitions.IDefinition;
-import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens;
-import org.apache.flex.compiler.internal.codegen.databinding.BindingDatabase;
-import org.apache.flex.compiler.internal.codegen.databinding.BindingInfo;
-import org.apache.flex.compiler.internal.codegen.databinding.FunctionWatcherInfo;
-import org.apache.flex.compiler.internal.codegen.databinding.PropertyWatcherInfo;
-import org.apache.flex.compiler.internal.codegen.databinding.StaticPropertyWatcherInfo;
-import org.apache.flex.compiler.internal.codegen.databinding.WatcherInfoBase;
-import org.apache.flex.compiler.internal.codegen.databinding.WatcherInfoBase.WatcherType;
-import org.apache.flex.compiler.internal.codegen.databinding.XMLWatcherInfo;
-import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitterTokens;
-import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitterTokens;
-import org.apache.flex.compiler.internal.codegen.js.vf2js.JSVF2JSEmitter;
-import org.apache.flex.compiler.internal.codegen.mxml.MXMLEmitter;
-import org.apache.flex.compiler.internal.codegen.mxml.flexjs.MXMLEventSpecifier;
-import org.apache.flex.compiler.internal.codegen.mxml.flexjs.MXMLFlexJSEmitterTokens;
-import org.apache.flex.compiler.internal.codegen.mxml.flexjs.MXMLScriptSpecifier;
-import org.apache.flex.compiler.internal.projects.FlexJSProject;
-import org.apache.flex.compiler.internal.projects.FlexProject;
-import org.apache.flex.compiler.internal.scopes.ASProjectScope;
-import org.apache.flex.compiler.internal.tree.as.FunctionCallNode;
-import org.apache.flex.compiler.internal.tree.as.IdentifierNode;
-import org.apache.flex.compiler.internal.tree.as.MemberAccessExpressionNode;
-import org.apache.flex.compiler.internal.tree.mxml.MXMLDocumentNode;
-import org.apache.flex.compiler.projects.ICompilerProject;
-import org.apache.flex.compiler.tree.ASTNodeID;
-import org.apache.flex.compiler.tree.as.IASNode;
-import org.apache.flex.compiler.tree.as.IExpressionNode;
-import org.apache.flex.compiler.tree.as.IImportNode;
-import org.apache.flex.compiler.tree.mxml.IMXMLArrayNode;
-import org.apache.flex.compiler.tree.mxml.IMXMLClassDefinitionNode;
-import org.apache.flex.compiler.tree.mxml.IMXMLClassNode;
-import org.apache.flex.compiler.tree.mxml.IMXMLComponentNode;
-import org.apache.flex.compiler.tree.mxml.IMXMLDataBindingNode;
-import org.apache.flex.compiler.tree.mxml.IMXMLDocumentNode;
-import org.apache.flex.compiler.tree.mxml.IMXMLEventSpecifierNode;
-import org.apache.flex.compiler.tree.mxml.IMXMLFactoryNode;
-import org.apache.flex.compiler.tree.mxml.IMXMLInstanceNode;
-import org.apache.flex.compiler.tree.mxml.IMXMLLiteralNode;
-import org.apache.flex.compiler.tree.mxml.IMXMLNode;
-import org.apache.flex.compiler.tree.mxml.IMXMLPropertySpecifierNode;
-import org.apache.flex.compiler.tree.mxml.IMXMLScriptNode;
-import org.apache.flex.compiler.tree.mxml.IMXMLSpecifierNode;
-import org.apache.flex.compiler.tree.mxml.IMXMLStateNode;
-import org.apache.flex.compiler.tree.mxml.IMXMLStringNode;
-import org.apache.flex.compiler.tree.mxml.IMXMLStyleSpecifierNode;
-import org.apache.flex.compiler.units.ICompilationUnit;
-import org.apache.flex.compiler.utils.NativeUtils;
-import org.apache.flex.compiler.visitor.mxml.IMXMLBlockWalker;
-
-/**
- * @author Erik de Bruin
- */
-public class MXMLVF2JSEmitter extends MXMLEmitter implements
-        IMXMLFlexJSEmitter
-{
-
-    private ArrayList<MXMLVF2JSDescriptorSpecifier> currentInstances;
-    private ArrayList<MXMLVF2JSDescriptorSpecifier> currentPropertySpecifiers;
-    private ArrayList<MXMLVF2JSDescriptorSpecifier> descriptorTree;
-    private MXMLVF2JSDescriptorSpecifier propertiesTree;
-    private ArrayList<MXMLEventSpecifier> events;
-    private ArrayList<MXMLVF2JSDescriptorSpecifier> instances;
-    private ArrayList<MXMLScriptSpecifier> scripts;
-    //private ArrayList<MXMLStyleSpecifier> styles;
-
-    private int eventCounter;
-    private int idCounter;
-
-    private boolean inMXMLContent;
-    private boolean inStatesOverride;
-    
-    private StringBuilder subDocuments = new StringBuilder();
-    private ArrayList<String> subDocumentNames = new ArrayList<String>();
-
-    public MXMLVF2JSEmitter(FilterWriter out)
-    {
-        super(out);
-    }
-
-    @Override
-    protected String getIndent(int numIndent)
-    {
-        final StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < numIndent; i++)
-            sb.append(JSFlexJSEmitterTokens.INDENT.getToken());
-        return sb.toString();
-    }
-
-    //--------------------------------------------------------------------------
-
-    @Override
-    public void emitDocument(IMXMLDocumentNode node)
-    {
-        descriptorTree = new ArrayList<MXMLVF2JSDescriptorSpecifier>();
-        propertiesTree = new MXMLVF2JSDescriptorSpecifier();
-
-        events = new ArrayList<MXMLEventSpecifier>();
-        instances = new ArrayList<MXMLVF2JSDescriptorSpecifier>();
-        scripts = new ArrayList<MXMLScriptSpecifier>();
-        //styles = new ArrayList<MXMLStyleSpecifier>();
-
-        currentInstances = new ArrayList<MXMLVF2JSDescriptorSpecifier>();
-        currentPropertySpecifiers = new ArrayList<MXMLVF2JSDescriptorSpecifier>();
-
-        eventCounter = 0;
-        idCounter = 0;
-
-        // visit MXML
-        IClassDefinition cdef = node.getClassDefinition();
-        IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
-                .getASEmitter();
-        ((JSVF2JSEmitter) asEmitter).getModel().setCurrentClass(cdef);
-
-        // visit tags
-        final int len = node.getChildCount();
-        for (int i = 0; i < len; i++)
-        {
-            getMXMLWalker().walk(node.getChild(i));
-        }
-
-        String cname = node.getFileNode().getName();
-
-        emitHeader(node);
-
-        write(subDocuments.toString());
-        writeNewline();
-
-        emitClassDeclStart(cname, node.getBaseClassName(), false);
-
-        emitPropertyDecls();
-        
-        emitClassDeclEnd(cname, node.getBaseClassName());
-
-        emitMetaData(cdef);
-        
-        emitScripts();
-
-        emitEvents(cname);
-
-        emitPropertyGetterSetters(cname);
-
-        emitMXMLDescriptorFuncs(cname);
-
-        emitBindingData(cname, cdef);
-
-    }
-
-    public void emitSubDocument(IMXMLComponentNode node)
-    {
-        ArrayList<MXMLVF2JSDescriptorSpecifier> oldDescriptorTree;
-        MXMLVF2JSDescriptorSpecifier oldPropertiesTree;
-        ArrayList<MXMLEventSpecifier> oldEvents;
-        ArrayList<MXMLScriptSpecifier> oldScripts;
-        ArrayList<MXMLVF2JSDescriptorSpecifier> oldCurrentInstances;
-        ArrayList<MXMLVF2JSDescriptorSpecifier> oldCurrentPropertySpecifiers;
-        int oldEventCounter;
-        int oldIdCounter;
-        
-        oldDescriptorTree = descriptorTree;
-        descriptorTree = new ArrayList<MXMLVF2JSDescriptorSpecifier>();
-        oldPropertiesTree = propertiesTree;
-        propertiesTree = new MXMLVF2JSDescriptorSpecifier();
-
-        oldEvents = events;
-        events = new ArrayList<MXMLEventSpecifier>();
-        // we don't save these.  We want all requires to be generated at the top of the file
-        instances = new ArrayList<MXMLVF2JSDescriptorSpecifier>();
-        oldScripts = scripts;
-        scripts = new ArrayList<MXMLScriptSpecifier>();
-        //styles = new ArrayList<MXMLStyleSpecifier>();
-
-        oldCurrentInstances = currentInstances;
-        currentInstances = new ArrayList<MXMLVF2JSDescriptorSpecifier>();
-        oldCurrentPropertySpecifiers = currentPropertySpecifiers;
-        currentPropertySpecifiers = new ArrayList<MXMLVF2JSDescriptorSpecifier>();
-
-        oldEventCounter = eventCounter;
-        eventCounter = 0;
-        oldIdCounter = idCounter;
-        idCounter = 0;
-
-        // visit MXML
-        IClassDefinition cdef = node.getContainedClassDefinition();
-        IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
-                .getASEmitter();
-        ((JSVF2JSEmitter) asEmitter).getModel().setCurrentClass(cdef);
-
-        IASNode classNode = node.getContainedClassDefinitionNode();
-        // visit tags
-        final int len = classNode.getChildCount();
-        for (int i = 0; i < len; i++)
-        {
-            getMXMLWalker().walk(classNode.getChild(i));
-        }
-
-        String cname = cdef.getQualifiedName();
-        subDocumentNames.add(cname);
-        String baseClassName = cdef.getBaseClassAsDisplayString();
-
-        emitClassDeclStart(cname, baseClassName, false);
-
-        emitPropertyDecls();
-        
-        emitClassDeclEnd(cname, baseClassName);
-
-        emitMetaData(cdef);
-
-        emitScripts();
-
-        emitEvents(cname);
-
-        emitPropertyGetterSetters(cname);
-
-        emitMXMLDescriptorFuncs(cname);
-
-        emitBindingData(cname, cdef);
-
-        descriptorTree = oldDescriptorTree;
-        propertiesTree = oldPropertiesTree;
-        events = oldEvents;
-        scripts = oldScripts;
-        currentInstances = oldCurrentInstances;
-        currentPropertySpecifiers = oldCurrentPropertySpecifiers;
-        eventCounter = oldEventCounter;
-        idCounter = oldIdCounter;
-
-    }
-
-    //--------------------------------------------------------------------------
-
-    protected void emitClassDeclStart(String cname, String baseClassName,
-            boolean indent)
-    {
-        writeNewline();
-        writeNewline("/**");
-        writeNewline(" * @constructor");
-        writeNewline(" * @extends {" + baseClassName + "}");
-        writeNewline(" */");
-        writeToken(cname);
-        writeToken(ASEmitterTokens.EQUAL);
-        write(ASEmitterTokens.FUNCTION);
-        write(ASEmitterTokens.PAREN_OPEN);
-        writeToken(ASEmitterTokens.PAREN_CLOSE);
-        if (indent)
-            indentPush();
-        writeNewline(ASEmitterTokens.BLOCK_OPEN, true);
-        write(cname);
-        write(ASEmitterTokens.MEMBER_ACCESS);
-        write(JSGoogEmitterTokens.GOOG_BASE);
-        write(ASEmitterTokens.PAREN_OPEN);
-        write(ASEmitterTokens.THIS);
-        writeToken(ASEmitterTokens.COMMA);
-        write(ASEmitterTokens.SINGLE_QUOTE);
-        write(JSGoogEmitterTokens.GOOG_CONSTRUCTOR);
-        write(ASEmitterTokens.SINGLE_QUOTE);
-        write(ASEmitterTokens.PAREN_CLOSE);
-        writeNewline(ASEmitterTokens.SEMICOLON);
-    }
-
-    //--------------------------------------------------------------------------
-
-    protected void emitClassDeclEnd(String cname, String baseClassName)
-    {
-        write(ASEmitterTokens.BLOCK_CLOSE);
-        writeNewline(ASEmitterTokens.SEMICOLON);
-        write(JSGoogEmitterTokens.GOOG_INHERITS);
-        write(ASEmitterTokens.PAREN_OPEN);
-        write(cname);
-        writeToken(ASEmitterTokens.COMMA);
-        write(baseClassName);
-        write(ASEmitterTokens.PAREN_CLOSE);
-        writeNewline(ASEmitterTokens.SEMICOLON);
-        writeNewline();
-        writeNewline();
-    }
-
-    //--------------------------------------------------------------------------
-
-    protected void emitMetaData(IClassDefinition cdef)
-    {
-        String cname = cdef.getQualifiedName();
-        
-        writeNewline("/**");
-        writeNewline(" * Metadata");
-        writeNewline(" *");
-        writeNewline(" * @type {Object.<string, Array.<Object>>}");
-        writeNewline(" */");
-        write(cname + ".prototype.FLEXJS_CLASS_INFO = { names: [{ name: '");
-        write(cdef.getBaseName());
-        write("', qName: '");
-        write(cname);
-        writeNewline("' }] };");
-        writeNewline();
-        writeNewline();
-    }
-
-    //--------------------------------------------------------------------------
-
-    protected void emitPropertyDecls()
-    {
-        indentPop();
-        
-        for (MXMLVF2JSDescriptorSpecifier instance : instances)
-        {
-            indentPush();
-            writeNewline();
-            writeNewline("/**");
-            writeNewline(" * @private");
-            writeNewline(" * @type {" + instance.name + "}");
-            writeNewline(" */");
-            write(ASEmitterTokens.THIS);
-            write(ASEmitterTokens.MEMBER_ACCESS);
-            write(instance.id);
-            indentPop();
-            writeNewline(ASEmitterTokens.SEMICOLON);
-        }
-    }
-
-    //--------------------------------------------------------------------------
-
-    protected void emitBindingData(String cname, IClassDefinition cdef)
-    {
-        BindingDatabase bd = BindingDatabase.bindingMap.get(cdef);
-        if (bd == null)
-            return;
-        if (bd.getBindingInfo().isEmpty())
-            return;
-
-        outputBindingInfoAsData(cname, bd);
-    }
-
-    private void outputBindingInfoAsData(String cname, BindingDatabase bindingDataBase)
-    {
-        IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
-        .getASEmitter();
-
-        writeNewline("/**");
-        writeNewline(" * @export");
-        writeNewline(" */");
-        writeNewline(cname
-                + ".prototype._bindings = [");
-        
-        Set<BindingInfo> bindingInfo = bindingDataBase.getBindingInfo();
-        writeNewline(bindingInfo.size() + ","); // number of bindings
-        
-        for (BindingInfo bi : bindingInfo)
-        {
-            String s;
-            s = bi.getSourceString();
-            if (s == null)
-                s = getSourceStringFromGetter(bi.getExpressionNodesForGetter());
-            if (s.contains("."))
-            {
-                String[] parts = s.split("\\.");
-                write(ASEmitterTokens.SQUARE_OPEN.getToken() + ASEmitterTokens.DOUBLE_QUOTE.getToken() + 
-                        parts[0] + ASEmitterTokens.DOUBLE_QUOTE.getToken());
-                int n = parts.length;
-                for (int i = 1; i < n; i++)
-                {
-                    String part = parts[i];
-                    write(", " +  ASEmitterTokens.DOUBLE_QUOTE.getToken() + part + ASEmitterTokens.DOUBLE_QUOTE.getToken());
-                }
-                writeNewline(ASEmitterTokens.SQUARE_CLOSE.getToken() + ASEmitterTokens.COMMA.getToken());
-            }
-            else if (s == null || s.length() == 0)
-            {
-                List<IExpressionNode> getterNodes = bi.getExpressionNodesForGetter();
-                StringBuilder sb = new StringBuilder();
-                sb.append("function() { return ");
-                for (IExpressionNode getterNode : getterNodes)
-                {
-                    sb.append(asEmitter.stringifyNode(getterNode));
-                }
-                sb.append("; },");
-                writeNewline(sb.toString());
-            }
-            else
-                writeNewline(ASEmitterTokens.DOUBLE_QUOTE.getToken() + s + 
-                        ASEmitterTokens.DOUBLE_QUOTE.getToken() + ASEmitterTokens.COMMA.getToken());
-            
-            IExpressionNode destNode = bi.getExpressionNodeForDestination();
-            if (destNode != null)
-            {
-                StringBuilder sb = new StringBuilder();
-                sb.append(asEmitter.stringifyNode(destNode));
-                writeNewline(sb.toString());
-            }
-            else
-                writeNewline(ASEmitterTokens.NULL.getToken() + ASEmitterTokens.COMMA.getToken());
-            
-            s = bi.getDestinationString();
-            if (s.contains("."))
-            {
-                String[] parts = s.split("\\.");
-                write(ASEmitterTokens.SQUARE_OPEN.getToken() + ASEmitterTokens.DOUBLE_QUOTE.getToken() + 
-                        parts[0] + ASEmitterTokens.DOUBLE_QUOTE.getToken());
-                int n = parts.length;
-                for (int i = 1; i < n; i++)
-                {
-                    String part = parts[i];
-                    write(", " + ASEmitterTokens.DOUBLE_QUOTE.getToken() + part + ASEmitterTokens.DOUBLE_QUOTE.getToken());
-                }
-                writeNewline(ASEmitterTokens.SQUARE_CLOSE.getToken() + ASEmitterTokens.COMMA.getToken());
-            }
-            else
-                writeNewline(ASEmitterTokens.DOUBLE_QUOTE.getToken() + s +
-                        ASEmitterTokens.DOUBLE_QUOTE.getToken() + ASEmitterTokens.COMMA.getToken());
-        }
-        Set<Entry<Object, WatcherInfoBase>> watcherChains = bindingDataBase.getWatcherChains();
-        for (Entry<Object, WatcherInfoBase> entry : watcherChains)
-        {
-            WatcherInfoBase watcherInfoBase = entry.getValue();
-            encodeWatcher(watcherInfoBase);
-        }
-        // add a trailing null for now so I don't have to have logic where the watcher figures out not to add
-        // a comma
-        writeNewline("null" + ASEmitterTokens.SQUARE_CLOSE.getToken() + ASEmitterTokens.SEMICOLON.getToken());
-    }
-
-    private void encodeWatcher(WatcherInfoBase watcherInfoBase)
-    {
-        IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
-        .getASEmitter();
-
-        writeNewline(watcherInfoBase.getIndex() + ASEmitterTokens.COMMA.getToken());
-        WatcherType type = watcherInfoBase.getType();
-        if (type == WatcherType.FUNCTION)
-        {
-            writeNewline("0" + ASEmitterTokens.COMMA.getToken());
-
-            FunctionWatcherInfo functionWatcherInfo = (FunctionWatcherInfo)watcherInfoBase;
-           
-            writeNewline(ASEmitterTokens.DOUBLE_QUOTE.getToken() + functionWatcherInfo.getFunctionName() + 
-                    ASEmitterTokens.DOUBLE_QUOTE.getToken());
-            IExpressionNode params[] = functionWatcherInfo.params;
-            StringBuilder sb = new StringBuilder();
-            sb.append("function() { return [");
-            boolean firstone = true;
-            for (IExpressionNode param : params)
-            {
-                if (firstone)
-                    firstone = false;
-                sb.append(ASEmitterTokens.COMMA.getToken());
-                sb.append(asEmitter.stringifyNode(param));   
-            }
-            sb.append("]; },");
-            outputEventNames(functionWatcherInfo.getEventNames());
-            outputBindings(functionWatcherInfo.getBindings());
-        }
-        else if ((type == WatcherType.STATIC_PROPERTY) || (type == WatcherType.PROPERTY))
-        {
-            writeNewline((type == WatcherType.STATIC_PROPERTY ? "1" : "2") + 
-                    ASEmitterTokens.COMMA.getToken());
-
-            PropertyWatcherInfo propertyWatcherInfo = (PropertyWatcherInfo)watcherInfoBase;
-           
-            boolean makeStaticWatcher = (watcherInfoBase.getType() == WatcherType.STATIC_PROPERTY);
-            
-            // round up the getter function for the watcher, or null if we don't need one
-            MethodInfo propertyGetterFunction = null;
-            if (watcherInfoBase.isRoot && !makeStaticWatcher)
-            {
-                // TODO: figure out what this looks like
-                // propertyGetterFunction = this.propertyGetter;
-                // assert propertyGetterFunction != null;
-            }
-            else if (watcherInfoBase.isRoot && makeStaticWatcher)
-            {
-                 // TODO: implement getter func for static watcher.
-            }
-            writeNewline(ASEmitterTokens.DOUBLE_QUOTE.getToken() + propertyWatcherInfo.getPropertyName() +
-                    ASEmitterTokens.DOUBLE_QUOTE.getToken() + ASEmitterTokens.COMMA.getToken());
-            outputEventNames(propertyWatcherInfo.getEventNames());
-            outputBindings(propertyWatcherInfo.getBindings());
-            if (propertyGetterFunction == null)
-                writeNewline("null" + ASEmitterTokens.COMMA.getToken()); // null is valid
-            if (type == WatcherType.STATIC_PROPERTY)
-            {
-                StaticPropertyWatcherInfo pwinfo = (StaticPropertyWatcherInfo)watcherInfoBase;
-                Name classMName = pwinfo.getContainingClass(getMXMLWalker().getProject());
-                writeNewline(nameToString(classMName));
-            }
-        }
-        else if (type == WatcherType.XML)
-        {
-            writeNewline("3" + ASEmitterTokens.COMMA.getToken());
-
-            XMLWatcherInfo xmlWatcherInfo = (XMLWatcherInfo)watcherInfoBase;
-            writeNewline(ASEmitterTokens.DOUBLE_QUOTE.getToken() + xmlWatcherInfo.getPropertyName() +
-                    ASEmitterTokens.DOUBLE_QUOTE.getToken() + ASEmitterTokens.COMMA.getToken());
-            outputBindings(xmlWatcherInfo.getBindings());
-        }
-        else assert false;     
-
-        // then recurse into children
-        Set<Entry<Object, WatcherInfoBase>> children = watcherInfoBase.getChildren();
-        if (children != null)
-        {
-            writeNewline(ASEmitterTokens.SQUARE_OPEN.getToken());
-            for ( Entry<Object, WatcherInfoBase> ent : children)
-            {
-                encodeWatcher(ent.getValue());
-            }
-            writeNewline("null" + ASEmitterTokens.SQUARE_CLOSE.getToken() + ASEmitterTokens.COMMA.getToken());
-        }
-        else
-        {
-            writeNewline("null" + ASEmitterTokens.COMMA.getToken());
-        }
-    }
-    
-    private String getSourceStringFromMemberAccessExpressionNode(MemberAccessExpressionNode node)
-    {
-        String s = "";
-        
-        IExpressionNode left = node.getLeftOperandNode();
-        if (left instanceof FunctionCallNode) //  probably a cast
-        {
-            IASNode child = ((FunctionCallNode)left).getArgumentsNode().getChild(0);
-            if (child instanceof IdentifierNode)
-                s = getSourceStringFromIdentifierNode((IdentifierNode)child);
-            else if (child instanceof MemberAccessExpressionNode)
-                s = getSourceStringFromMemberAccessExpressionNode((MemberAccessExpressionNode)child);
-        }
-        else if (left instanceof MemberAccessExpressionNode)
-            s = getSourceStringFromMemberAccessExpressionNode((MemberAccessExpressionNode)left);
-        else if (left instanceof IdentifierNode)
-            s = getSourceStringFromIdentifierNode((IdentifierNode)left);
-        else
-            System.out.println("expected binding member access left node" + node.toString());
-        s += ".";
-        
-        IExpressionNode right = node.getRightOperandNode();
-        if (right instanceof FunctionCallNode) //  probably a cast
-        {
-            IASNode child = ((FunctionCallNode)right).getArgumentsNode().getChild(0);
-            if (child instanceof IdentifierNode)
-                s += getSourceStringFromIdentifierNode((IdentifierNode)child);
-            else if (child instanceof MemberAccessExpressionNode)
-                s += getSourceStringFromMemberAccessExpressionNode((MemberAccessExpressionNode)child);
-        }
-        else if (right instanceof MemberAccessExpressionNode)
-            s += getSourceStringFromMemberAccessExpressionNode((MemberAccessExpressionNode)right);
-        else if (right instanceof IdentifierNode)
-            s += getSourceStringFromIdentifierNode((IdentifierNode)right);
-        else
-            System.out.println("expected binding member access right node" + node.toString());
-        
-        return s;
-    }
-    
-    private String getSourceStringFromIdentifierNode(IdentifierNode node)
-    {
-        return node.getName();
-    }
-    
-    private String getSourceStringFromGetter(List<IExpressionNode> nodes)
-    {
-        String s = "";
-        IExpressionNode node = nodes.get(0);
-        if (node instanceof MemberAccessExpressionNode)
-        {
-            s = getSourceStringFromMemberAccessExpressionNode((MemberAccessExpressionNode)node);
-        }
-        return s;
-    }
-    
-    private void outputEventNames(List<String> events)
-    {
-        if (events.size() > 1)
-        {
-            int n = events.size();
-            write(ASEmitterTokens.SQUARE_OPEN.getToken() + ASEmitterTokens.DOUBLE_QUOTE.getToken() +
-                    events.get(0) + ASEmitterTokens.DOUBLE_QUOTE.getToken());
-            for (int i = 1; i < n; i++)
-            {
-                String event = events.get(i);
-                write(ASEmitterTokens.COMMA.getToken() + ASEmitterTokens.DOUBLE_QUOTE.getToken() + 
-                        event + ASEmitterTokens.DOUBLE_QUOTE.getToken());
-            }
-            writeNewline(ASEmitterTokens.SQUARE_CLOSE.getToken() + ASEmitterTokens.COMMA.getToken());
-        }
-        else if (events.size() == 1)
-            writeNewline(ASEmitterTokens.DOUBLE_QUOTE.getToken() + events.get(0) +
-                    ASEmitterTokens.DOUBLE_QUOTE.getToken() + ASEmitterTokens.COMMA.getToken());
-        else
-            writeNewline("null" + ASEmitterTokens.COMMA.getToken());
-    }
-    
-    private void outputBindings(List<BindingInfo> bindings)
-    {
-        if (bindings.size() > 1)
-        {
-            int n = bindings.size();
-            write(ASEmitterTokens.SQUARE_OPEN.getToken() + bindings.get(0).getIndex());
-            for (int i = 1; i < n; i++)
-            {
-                BindingInfo binding = bindings.get(i);
-                write(ASEmitterTokens.COMMA.getToken() + binding.getIndex());
-            }
-            writeNewline(ASEmitterTokens.SQUARE_CLOSE.getToken() + ASEmitterTokens.COMMA.getToken());
-        }
-        else if (bindings.size() == 1)
-            writeNewline(bindings.get(0).getIndex() + ASEmitterTokens.COMMA.getToken());
-        else
-            writeNewline("null" + ASEmitterTokens.COMMA.getToken());
-        
-    }
-
-    //--------------------------------------------------------------------------    
-
-    protected void emitScripts()
-    {
-        for (MXMLScriptSpecifier script : scripts)
-        {
-            String output = script.output();
-
-            if (!output.equals(""))
-            {
-                writeNewline(output);
-            }
-        }
-    }
-
-    //--------------------------------------------------------------------------    
-
-    protected void emitEvents(String cname)
-    {
-        for (MXMLEventSpecifier event : events)
-        {
-            writeNewline("/**");
-            writeNewline(" * @export");
-            writeNewline(" * @param {" + event.type + "} event");
-            writeNewline(" */");
-            writeNewline(cname
-                    + ".prototype." + event.eventHandler + " = function(event)");
-            writeNewline(ASEmitterTokens.BLOCK_OPEN, true);
-
-            writeNewline(event.value + ASEmitterTokens.SEMICOLON.getToken(),
-                    false);
-
-            write(ASEmitterTokens.BLOCK_CLOSE);
-            writeNewline(";");
-            writeNewline();
-            writeNewline();
-        }
-    }
-
-    //--------------------------------------------------------------------------    
-
-    protected void emitPropertyGetterSetters(String cname)
-    {
-        for (MXMLVF2JSDescriptorSpecifier instance : instances)
-        {
-            if (!instance.id.startsWith(MXMLFlexJSEmitterTokens.ID_PREFIX
-                    .getToken()))
-            {
-                writeNewline("/**");
-                writeNewline(" * @export");
-                writeNewline(" * @return {" + instance.name + "}");
-                writeNewline(" */");
-                writeNewline(cname
-                        + ".prototype.get_" + instance.id + " = function()");
-                indentPush();
-                writeNewline("{");
-                indentPop();
-                writeNewline("return this." + instance.id + ";");
-                writeNewline("};");
-                writeNewline();
-                writeNewline();
-                writeNewline("/**");
-                writeNewline(" * @export");
-                writeNewline(" * @param {" + instance.name + "} value");
-                writeNewline(" */");
-                writeNewline(cname
-                        + ".prototype.set_" + instance.id
-                        + " = function(value)");
-                indentPush();
-                writeNewline("{");
-                indentPush();
-                writeNewline("if (value != this." + instance.id + ")");
-                indentPop();
-                indentPop();
-                writeNewline("this." + instance.id + " = value;");
-                writeNewline("};");
-                writeNewline();
-                writeNewline();
-            }
-        }
-    }
-
-    //--------------------------------------------------------------------------    
-
-    protected void emitMXMLDescriptorFuncs(String cname)
-    {
-        // top level is 'mxmlContent', skip it...
-        if (descriptorTree.size() > 0)
-        {
-            MXMLVF2JSDescriptorSpecifier root = descriptorTree.get(0);
-            root.isTopNode = false;
-    
-            //writeNewline(root.output(true));
-        }
-        
-        if (propertiesTree.propertySpecifiers.size() > 0 ||
-                propertiesTree.eventSpecifiers.size() > 0)
-        {
-            MXMLVF2JSDescriptorSpecifier root = propertiesTree;
-            root.isTopNode = true;
-
-            writeNewline("/**");
-            writeNewline(" * start");
-            writeNewline(" *");
-            writeNewline(" * @export");
-            writeNewline(" */");
-            writeNewline(cname + ".prototype.start = function () {");
-            //writeNewline(root.output(true));
-            writeNewline("};");
-        }
-    }
-
-    //--------------------------------------------------------------------------    
-
-    @Override
-    public void emitEventSpecifier(IMXMLEventSpecifierNode node)
-    {
-        IDefinition cdef = node.getDefinition();
-
-        MXMLVF2JSDescriptorSpecifier currentDescriptor = getCurrentDescriptor("i");
-
-        MXMLEventSpecifier eventSpecifier = new MXMLEventSpecifier();
-        eventSpecifier.eventHandler = MXMLFlexJSEmitterTokens.EVENT_PREFIX
-                .getToken() + eventCounter++;
-        eventSpecifier.name = cdef.getBaseName();
-        eventSpecifier.type = node.getEventParameterDefinition()
-                .getTypeAsDisplayString();
-
-        IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
-                .getASEmitter();
-
-        StringBuilder sb = null;
-        int len = node.getChildCount();
-        if (len > 0)
-        {
-            sb = new StringBuilder();
-            for (int i = 0; i < len; i++)
-            {
-                sb.append(getIndent((i > 0) ? 1 : 0)
-                        + asEmitter.stringifyNode(node.getChild(i)));
-                if (i < len - 1)
-                {
-                    sb.append(ASEmitterTokens.SEMICOLON.getToken());
-                    sb.append(ASEmitterTokens.NEW_LINE.getToken());
-                }
-            }
-        }
-        eventSpecifier.value = sb.toString();
-
-        if (currentDescriptor != null)
-            currentDescriptor.eventSpecifiers.add(eventSpecifier);
-        else  // in theory, if no currentdescriptor must be top tag event
-            propertiesTree.eventSpecifiers.add(eventSpecifier);
-
-        events.add(eventSpecifier);
-    }
-
-    @Override
-    public void emitInstance(IMXMLInstanceNode node)
-    {
-        if (isStateDependent(node) && !inStatesOverride)
-            return;
-        
-        IClassDefinition cdef = node
-                .getClassReference((ICompilerProject) getMXMLWalker()
-                        .getProject());
-
-        MXMLVF2JSDescriptorSpecifier currentPropertySpecifier = getCurrentDescriptor("ps");
-
-        String id = node.getID();
-        if (id == null)
-            id = node.getEffectiveID();
-        if (id == null)
-            id = MXMLFlexJSEmitterTokens.ID_PREFIX.getToken() + idCounter++;
-
-        MXMLVF2JSDescriptorSpecifier currentInstance = new MXMLVF2JSDescriptorSpecifier();
-        currentInstance.isProperty = false;
-        currentInstance.id = id;
-        currentInstance.name = cdef.getQualifiedName();
-        currentInstance.parent = currentPropertySpecifier;
-
-        if (currentPropertySpecifier != null)
-            currentPropertySpecifier.propertySpecifiers.add(currentInstance);
-        else if (inMXMLContent)
-            descriptorTree.add(currentInstance);
-        else
-        {
-            currentInstance.parent = propertiesTree;
-            propertiesTree.propertySpecifiers.add(currentInstance);
-        }
-
-        instances.add(currentInstance);
-
-        IMXMLPropertySpecifierNode[] pnodes = node.getPropertySpecifierNodes();
-        if (pnodes != null)
-        {
-            moveDown(false, currentInstance, null);
-
-            for (IMXMLPropertySpecifierNode pnode : pnodes)
-            {
-                getMXMLWalker().walk(pnode); // Property Specifier
-            }
-
-            moveUp(false, true);
-        }
-        else if (node instanceof IMXMLStateNode)
-        {
-            IMXMLStateNode stateNode = (IMXMLStateNode)node;
-            String name = stateNode.getStateName();
-            if (name != null)
-            {
-                MXMLVF2JSDescriptorSpecifier stateName = new MXMLVF2JSDescriptorSpecifier();
-                stateName.isProperty = true;
-                stateName.id = id;
-                stateName.name = "name";
-                stateName.value = ASEmitterTokens.SINGLE_QUOTE.getToken() + name + ASEmitterTokens.SINGLE_QUOTE.getToken();
-                stateName.parent = currentInstance;
-                currentInstance.propertySpecifiers.add(stateName);
-            }
-            MXMLVF2JSDescriptorSpecifier overrides = new MXMLVF2JSDescriptorSpecifier();
-            overrides.isProperty = true;
-            overrides.hasArray = true;
-            overrides.id = id;
-            overrides.name = "overrides";
-            overrides.parent = currentInstance;
-            currentInstance.propertySpecifiers.add(overrides);
-            moveDown(false, null, overrides);
-
-            IMXMLClassDefinitionNode classDefinitionNode = stateNode.getClassDefinitionNode();
-            List<IMXMLNode> snodes = classDefinitionNode.getNodesDependentOnState(stateNode.getStateName());
-            if (snodes != null)
-            {
-                for (int i=snodes.size()-1; i>=0; --i)
-                {
-                    IMXMLNode inode = snodes.get(i);
-                    if (inode.getNodeID() == ASTNodeID.MXMLInstanceID)
-                    {
-                        emitInstanceOverride((IMXMLInstanceNode)inode);
-                    }
-                }
-                // Next process the non-instance overrides dependent on this state.
-                // Each one will generate code to push an IOverride instance.
-                for (IMXMLNode anode : snodes)
-                {
-                    switch (anode.getNodeID())
-                    {
-                        case MXMLPropertySpecifierID:
-                        {
-                            emitPropertyOverride((IMXMLPropertySpecifierNode)anode);
-                            break;
-                        }
-                        case MXMLStyleSpecifierID:
-                        {
-                            if (node instanceof IMXMLStyleSpecifierNode)
-                            {
-                                emitStyleOverride((IMXMLStyleSpecifierNode)node);
-                            }
-                            break;
-                        }
-                        case MXMLEventSpecifierID:
-                        {
-                            emitEventOverride((IMXMLEventSpecifierNode)node);
-                            break;
-                        }
-                        default:
-                        {
-                            break;
-                        }
-                    }
-                }
-            }
-            
-            moveUp(false, false);
-        }
-
-        IMXMLEventSpecifierNode[] enodes = node.getEventSpecifierNodes();
-        if (enodes != null)
-        {
-            moveDown(false, currentInstance, null);
-
-            for (IMXMLEventSpecifierNode enode : enodes)
-            {
-                getMXMLWalker().walk(enode); // Event Specifier
-            }
-
-            moveUp(false, true);
-        }
-    }
-
-    public void emitPropertyOverride(IMXMLPropertySpecifierNode propertyNode)
-    {
-        FlexProject project = (FlexProject) getMXMLWalker().getProject();
-        Name propertyOverride = project.getPropertyOverrideClassName();
-        emitPropertyOrStyleOverride(propertyOverride, propertyNode);
-    }
-    
-    /**
-     * Generates instructions in the current context
-     * to create an instance of mx.states.SetStyle
-     * with its <code>target</code>, <code>name</code>,
-     * and <code>value</code> properties set.
-     */
-    void emitStyleOverride(IMXMLStyleSpecifierNode styleNode)
-    {
-        FlexProject project = (FlexProject) getMXMLWalker().getProject();
-        Name styleOverride = project.getStyleOverrideClassName();
-        emitPropertyOrStyleOverride(styleOverride, styleNode);
-    }
-    
-    void emitPropertyOrStyleOverride(Name overrideName, IMXMLPropertySpecifierNode propertyOrStyleNode)
-    {
-        MXMLVF2JSDescriptorSpecifier currentInstance = getCurrentDescriptor("ps");
-        IASNode parentNode = propertyOrStyleNode.getParent();
-        String id = parentNode instanceof IMXMLInstanceNode ?
-                    ((IMXMLInstanceNode)parentNode).getEffectiveID() :
-                    "";
-        
-        String name = propertyOrStyleNode.getName();        
-        
-        IMXMLInstanceNode propertyOrStyleValueNode = propertyOrStyleNode.getInstanceNode();
-        
-        MXMLVF2JSDescriptorSpecifier setProp = new MXMLVF2JSDescriptorSpecifier();
-        setProp.isProperty = false;
-        setProp.name = nameToString(overrideName);
-        setProp.parent = currentInstance;
-        currentInstance.propertySpecifiers.add(setProp);
-            // Set its 'target' property to the id of the object
-            // whose property or style this override will set.
-        MXMLVF2JSDescriptorSpecifier target = new MXMLVF2JSDescriptorSpecifier();
-        target.isProperty = true;
-        target.name = "target";
-        target.parent = setProp;
-        target.value = ASEmitterTokens.SINGLE_QUOTE.getToken() + id + ASEmitterTokens.SINGLE_QUOTE.getToken();
-        setProp.propertySpecifiers.add(target);
-
-            // Set its 'name' property to the name of the property or style.
-        MXMLVF2JSDescriptorSpecifier pname = new MXMLVF2JSDescriptorSpecifier();
-        pname.isProperty = true;
-        pname.name = "name";
-        pname.parent = setProp;
-        pname.value = ASEmitterTokens.SINGLE_QUOTE.getToken() + name + ASEmitterTokens.SINGLE_QUOTE.getToken();
-        setProp.propertySpecifiers.add(pname);
-
-            // Set its 'value' property to the value of the property or style.
-        MXMLVF2JSDescriptorSpecifier value = new MXMLVF2JSDescriptorSpecifier();
-        value.isProperty = true;
-        value.name = "value";
-        value.parent = setProp;
-        setProp.propertySpecifiers.add(value);
-        moveDown(false, null, value);
-        getMXMLWalker().walk(propertyOrStyleValueNode); // instance node
-        moveUp(false, false);
-    }
-        
-    /**
-     * Generates instructions in the current context
-     * to create an instance of mx.states.SetEventHandler
-     * with its <code>target</code>, <code>name</code>,
-     * and <code>handlerFunction</code> properties set.
-     */
-    void emitEventOverride(IMXMLEventSpecifierNode eventNode)
-    {
-        MXMLVF2JSDescriptorSpecifier currentInstance = getCurrentDescriptor("ps");
-        FlexProject project = (FlexProject) getMXMLWalker().getProject();
-        Name eventOverride = project.getEventOverrideClassName();
-        
-        IASNode parentNode = eventNode.getParent();
-        String id = parentNode instanceof IMXMLInstanceNode ?
-                    ((IMXMLInstanceNode)parentNode).getEffectiveID() :
-                    "";
-        
-        String name = eventNode.getName();
-        
-        MXMLDocumentNode doc = (MXMLDocumentNode)eventNode.getAncestorOfType(MXMLDocumentNode.class);
-
-        Name eventHandler = doc.cdp.getEventHandlerName(eventNode);
-
-        MXMLVF2JSDescriptorSpecifier setEvent = new MXMLVF2JSDescriptorSpecifier();
-        setEvent.isProperty = true;
-        setEvent.name = nameToString(eventOverride);
-        setEvent.parent = currentInstance;
-        currentInstance.propertySpecifiers.add(setEvent);
-        // Set its 'target' property to the id of the object
-        // whose event this override will set.
-        MXMLVF2JSDescriptorSpecifier target = new MXMLVF2JSDescriptorSpecifier();
-        target.isProperty = true;
-        target.name = "target";
-        target.parent = setEvent;
-        target.value = ASEmitterTokens.SINGLE_QUOTE.getToken() + id + ASEmitterTokens.SINGLE_QUOTE.getToken();
-        setEvent.propertySpecifiers.add(target);
-
-        // Set its 'name' property to the name of the property or style.
-        MXMLVF2JSDescriptorSpecifier pname = new MXMLVF2JSDescriptorSpecifier();
-        pname.isProperty = true;
-        pname.name = "name";
-        pname.parent = setEvent;
-        pname.value = ASEmitterTokens.SINGLE_QUOTE.getToken() + name + ASEmitterTokens.SINGLE_QUOTE.getToken();
-        setEvent.propertySpecifiers.add(pname);
-        
-        // Set its 'handlerFunction' property to the autogenerated event handler.
-        MXMLVF2JSDescriptorSpecifier handler = new MXMLVF2JSDescriptorSpecifier();
-        handler.isProperty = false;
-        handler.name = "handlerFunction";
-        handler.parent = setEvent;
-        handler.value = eventHandler.toString();
-        setEvent.propertySpecifiers.add(handler);
-        
-    }
-
-    public void emitInstanceOverride(IMXMLInstanceNode instanceNode)
-    {
-        inStatesOverride = true;
-        
-        MXMLVF2JSDescriptorSpecifier currentInstance = getCurrentDescriptor("ps");
-        FlexProject project = (FlexProject) getMXMLWalker().getProject();
-        Name instanceOverrideName = project.getInstanceOverrideClassName();
-
-        MXMLVF2JSDescriptorSpecifier addItems = new MXMLVF2JSDescriptorSpecifier();
-        addItems.isProperty = false;
-        addItems.name = nameToString(instanceOverrideName);
-        addItems.parent = currentInstance;
-        currentInstance.propertySpecifiers.add(addItems);
-        MXMLVF2JSDescriptorSpecifier itemsDesc = new MXMLVF2JSDescriptorSpecifier();
-        itemsDesc.isProperty = true;
-        itemsDesc.hasArray = true;
-        itemsDesc.name = "itemsDescriptor";
-        itemsDesc.parent = addItems;
-        addItems.propertySpecifiers.add(itemsDesc);
-        boolean oldInMXMLContent = inMXMLContent;
-        moveDown(false, null, itemsDesc);
-        inMXMLContent = true;
-        getMXMLWalker().walk(instanceNode); // instance node
-        inMXMLContent = oldInMXMLContent;
-        moveUp(false, false);
-        
-        //-----------------------------------------------------------------------------
-        // Second property set: maybe set destination and propertyName
-        
-        // get the property specifier node for the property the instanceNode represents
-        IMXMLPropertySpecifierNode propertySpecifier = (IMXMLPropertySpecifierNode) 
-            instanceNode.getAncestorOfType( IMXMLPropertySpecifierNode.class);
-    
-        if (propertySpecifier == null)
-        {
-           assert false;        // I think this indicates an invalid tree...
-        }
-        else
-        {
-            // Check the parent - if it's an instance then we want to use these
-            // nodes to get our property values from. If not, then it's the root
-            // and we don't need to specify destination
-            
-            IASNode parent = propertySpecifier.getParent();
-            if (parent instanceof IMXMLInstanceNode)
-            {
-               IMXMLInstanceNode parentInstance = (IMXMLInstanceNode)parent;
-               String parentId = parentInstance.getEffectiveID();
-               assert parentId != null;
-               String propName = propertySpecifier.getName();
-               
-               MXMLVF2JSDescriptorSpecifier dest = new MXMLVF2JSDescriptorSpecifier();
-               dest.isProperty = true;
-               dest.name = "destination";
-               dest.parent = addItems;
-               dest.value = ASEmitterTokens.SINGLE_QUOTE.getToken() + parentId + ASEmitterTokens.SINGLE_QUOTE.getToken();
-               addItems.propertySpecifiers.add(dest);
-
-               MXMLVF2JSDescriptorSpecifier prop = new MXMLVF2JSDescriptorSpecifier();
-               prop.isProperty = true;
-               prop.name = "propertyName";
-               prop.parent = addItems;
-               prop.value = ASEmitterTokens.SINGLE_QUOTE.getToken() + propName + ASEmitterTokens.SINGLE_QUOTE.getToken();
-               addItems.propertySpecifiers.add(prop);
-            }
-        }  
-        
-        //---------------------------------------------------------------
-        // Third property set: position and relativeTo
-        String positionPropertyValue = null;
-        String relativeToPropertyValue = null;
-       
-        // look to see if we have any sibling nodes that are not state dependent
-        // that come BEFORE us
-        IASNode instanceParent = instanceNode.getParent();
-        IASNode prevStatelessSibling=null;
-        for (int i=0; i< instanceParent.getChildCount(); ++i)
-        {
-            IASNode sib = instanceParent.getChild(i);
-            assert sib instanceof IMXMLInstanceNode;    // surely our siblings are also instances?
-           
-            // stop looking for previous nodes when we find ourself
-            if (sib == instanceNode)
-                break;
-
-            if (!isStateDependent(sib))
-            {
-                prevStatelessSibling = sib;
-            }
-        }
-        
-        if (prevStatelessSibling == null) {
-            positionPropertyValue = "first";        // TODO: these should be named constants
-        }
-        else {
-            positionPropertyValue = "after";
-            relativeToPropertyValue = ((IMXMLInstanceNode)prevStatelessSibling).getEffectiveID();
-        }
-       
-        MXMLVF2JSDescriptorSpecifier pos = new MXMLVF2JSDescriptorSpecifier();
-        pos.isProperty = true;
-        pos.name = "position";
-        pos.parent = addItems;
-        pos.value = ASEmitterTokens.SINGLE_QUOTE.getToken() + positionPropertyValue + ASEmitterTokens.SINGLE_QUOTE.getToken();
-        addItems.propertySpecifiers.add(pos);
-        
-        if (relativeToPropertyValue != null)
-        {
-            MXMLVF2JSDescriptorSpecifier rel = new MXMLVF2JSDescriptorSpecifier();
-            rel.isProperty = true;
-            rel.name = "relativeTo";
-            rel.parent = addItems;
-            rel.value = ASEmitterTokens.SINGLE_QUOTE.getToken() + relativeToPropertyValue + ASEmitterTokens.SINGLE_QUOTE.getToken();
-            addItems.propertySpecifiers.add(rel);
-        }
-        
-        inStatesOverride = false;
-    }
-
-    private String nameToString(Name name)
-    {
-        String s = "";
-        Namespace ns = name.getSingleQualifier();
-        s = ns.getName() + ASEmitterTokens.MEMBER_ACCESS.getToken() + name.getBaseName();
-        return s;
-    }
-    /**
-     * Determines whether a node is state-dependent.
-     * TODO: we should move to IMXMLNode
-     */
-    protected boolean isStateDependent(IASNode node)
-    {
-        if (node instanceof IMXMLSpecifierNode)
-        {
-            String suffix = ((IMXMLSpecifierNode)node).getSuffix();
-            return suffix != null && suffix.length() > 0;
-        }
-        else if (isStateDependentInstance(node))
-            return true;
-        return false;
-    }
-    
-    /**
-     * Determines whether the geven node is an instance node, as is state dependent
-     */
-    protected boolean isStateDependentInstance(IASNode node)
-    {
-        if (node instanceof IMXMLInstanceNode)
-        {
-            String[] includeIn = ((IMXMLInstanceNode)node).getIncludeIn();
-            String[] excludeFrom = ((IMXMLInstanceNode)node).getExcludeFrom();
-            return includeIn != null || excludeFrom != null;
-        }
-        return false;
-    }
-    
-    /**
-     * Is a give node a "databinding node"?
-     */
-    public static boolean isDataBindingNode(IASNode node)
-    {
-        return node instanceof IMXMLDataBindingNode;
-    }
-    
-    protected static boolean isDataboundProp(IMXMLPropertySpecifierNode propertyNode)
-    {
-        boolean ret = propertyNode.getChildCount() > 0 && isDataBindingNode(propertyNode.getInstanceNode());
-        
-        // Sanity check that we based our conclusion about databinding on the correct node.
-        // (code assumes only one child if databinding)
-        int n = propertyNode.getChildCount();
-        for (int i = 0; i < n; i++)
-        {
-            boolean db = isDataBindingNode(propertyNode.getChild(i));
-            assert db == ret;
-        }
-        
-        return ret;
-    }
-
-    @Override
-    public void emitPropertySpecifier(IMXMLPropertySpecifierNode node)
-    {
-        if (isDataboundProp(node))
-            return;
-        
-        IDefinition cdef = node.getDefinition();
-
-        IASNode cnode = node.getChild(0);
-
-        MXMLVF2JSDescriptorSpecifier currentInstance = getCurrentDescriptor("i");
-
-        MXMLVF2JSDescriptorSpecifier currentPropertySpecifier = new MXMLVF2JSDescriptorSpecifier();
-        currentPropertySpecifier.isProperty = true;
-        currentPropertySpecifier.name = cdef.getQualifiedName();
-        currentPropertySpecifier.parent = currentInstance;
-
-        boolean oldInMXMLContent = inMXMLContent;
-        if (currentPropertySpecifier.name.equals("mxmlContent"))
-            inMXMLContent = true;
-        
-        if (currentInstance != null)
-            currentInstance.propertySpecifiers.add(currentPropertySpecifier);
-        else if (inMXMLContent)
-            descriptorTree.add(currentPropertySpecifier);
-        else
-        {
-            currentPropertySpecifier.parent = propertiesTree;
-            propertiesTree.propertySpecifiers.add(currentPropertySpecifier);
-        }
-
-        boolean bypass = cnode != null && cnode instanceof IMXMLArrayNode;
-
-        currentPropertySpecifier.hasArray = bypass;
-
-        moveDown(bypass, null, currentPropertySpecifier);
-
-        getMXMLWalker().walk(cnode); // Array or Instance
-
-        moveUp(bypass, false);
-        
-        inMXMLContent = oldInMXMLContent;
-    }
-
-    @Override
-    public void emitScript(IMXMLScriptNode node)
-    {
-        IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
-                .getASEmitter();
-
-        String nl = ASEmitterTokens.NEW_LINE.getToken();
-
-        StringBuilder sb = null;
-        MXMLScriptSpecifier scriptSpecifier = null;
-
-        int len = node.getChildCount();
-        if (len > 0)
-        {
-            for (int i = 0; i < len; i++)
-            {
-                IASNode cnode = node.getChild(i);
-
-                if (!(cnode instanceof IImportNode))
-                {
-                    sb = new StringBuilder();
-                    scriptSpecifier = new MXMLScriptSpecifier();
-
-                    sb.append(asEmitter.stringifyNode(cnode));
-
-                    sb.append(ASEmitterTokens.SEMICOLON.getToken());
-
-                    if (i == len - 1)
-                        indentPop();
-
-                    sb.append(nl);
-                    sb.append(nl);
-
-                    scriptSpecifier.fragment = sb.toString();
-
-                    scripts.add(scriptSpecifier);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void emitStyleSpecifier(IMXMLStyleSpecifierNode node)
-    {
-    }
-
-    //--------------------------------------------------------------------------
-
-    @Override
-    public void emitArray(IMXMLArrayNode node)
-    {
-        moveDown(false, null, null);
-
-        final int len = node.getChildCount();
-        for (int i = 0; i < len; i++)
-        {
-            getMXMLWalker().walk(node.getChild(i)); // Instance
-        }
-
-        moveUp(false, false);
-    }
-
-    @Override
-    public void emitString(IMXMLStringNode node)
-    {
-        getCurrentDescriptor("ps").valueNeedsQuotes = true;
-
-        emitAttributeValue(node);
-    }
-
-    //--------------------------------------------------------------------------
-
-    @Override
-    public void emitLiteral(IMXMLLiteralNode node)
-    {
-        MXMLVF2JSDescriptorSpecifier ps = getCurrentDescriptor("ps");
-        ps.value = "";
-
-        if (ps.valueNeedsQuotes)
-            ps.value += ASEmitterTokens.SINGLE_QUOTE.getToken();
-
-        String s = node.getValue().toString();
-        if (ps.valueNeedsQuotes)
-        {
-            // escape all single quotes found within the string
-            s = s.replace(ASEmitterTokens.SINGLE_QUOTE.getToken(), 
-                    "\\" + ASEmitterTokens.SINGLE_QUOTE.getToken());
-        }
-        ps.value += s;
-        
-        if (ps.valueNeedsQuotes)
-            ps.value += ASEmitterTokens.SINGLE_QUOTE.getToken();
-    }
-
-    //--------------------------------------------------------------------------
-
-    @Override
-    public void emitFactory(IMXMLFactoryNode node)
-    {
-        MXMLVF2JSDescriptorSpecifier ps = getCurrentDescriptor("ps");
-        ps.value = "new mx.core.ClassFactory(";
-
-        IASNode cnode = node.getChild(0);
-        if (cnode instanceof IMXMLClassNode)
-        {
-            ps.value += ((IMXMLClassNode)cnode).getValue(getMXMLWalker().getProject()).getQualifiedName();
-        }
-        ps.value += ")";
-    }
-
-    //--------------------------------------------------------------------------
-
-    @Override
-    public void emitComponent(IMXMLComponentNode node)
-    {
-        MXMLVF2JSDescriptorSpecifier ps = getCurrentDescriptor("ps");
-        ps.value = "new mx.core.ClassFactory(";
-
-        ps.value += node.getName();
-        ps.value += ")";
-        
-        setBufferWrite(true);
-        emitSubDocument(node);
-        subDocuments.append(getBuilder().toString());
-        getBuilder().setLength(0);
-        setBufferWrite(false);
-    }
-
-    //--------------------------------------------------------------------------
-    //    JS output
-    //--------------------------------------------------------------------------
-    
-    private void emitHeader(IMXMLDocumentNode node)
-    {
-        String cname = node.getFileNode().getName();
-        String bcname = node.getBaseClassName();
-
-        writeNewline("/**");
-        writeNewline(" * " + cname);
-        writeNewline(" *");
-        writeNewline(" * @fileoverview");
-        writeNewline(" *");
-        writeNewline(" * @suppress {checkTypes}");
-        writeNewline(" */");
-        writeNewline();
-        
-        emitHeaderLine(cname, true); // provide
-        for (String subDocumentName : subDocumentNames)
-            emitHeaderLine(subDocumentName, true);
-        writeNewline();
-        emitHeaderLine(bcname);
-        ArrayList<String> writtenInstances = new ArrayList<String>();
-        writtenInstances.add(cname); // make sure we don't add ourselves
-        writtenInstances.add(bcname); // make sure we don't add the baseclass twice
-        for (MXMLVF2JSDescriptorSpecifier instance : instances)
-        {
-            String name = instance.name;
-            if (writtenInstances.indexOf(name) == -1)
-            {
-                emitHeaderLine(name);
-                writtenInstances.add(name);
-            }
-        }
-        FlexJSProject project = (FlexJSProject) getMXMLWalker().getProject();
-        ASProjectScope projectScope = (ASProjectScope) project.getScope();
-        IDefinition cdef = node.getDefinition();
-        ICompilationUnit cu = projectScope
-                .getCompilationUnitForDefinition(cdef);
-        ArrayList<String> deps = project.getRequires(cu);
-
-        if (deps != null)
-        {
-            for (String imp : deps)
-            {
-                if (imp.indexOf(JSGoogEmitterTokens.AS3.getToken()) != -1)
-                    continue;
-    
-                if (imp.equals(cname))
-                    continue;
-    
-                if (imp.equals("mx.binding.Binding"))
-                    continue;
-                if (imp.equals("mx.binding.BindingManager"))
-                    continue;
-                if (imp.equals("mx.binding.FunctionReturnWatcher"))
-                    continue;
-                if (imp.equals("mx.binding.PropertyWatcher"))
-                    continue;
-                if (imp.equals("mx.binding.StaticPropertyWatcher"))
-                    continue;
-                if (imp.equals("mx.binding.XMLWatcher"))
-                    continue;
-                if (imp.equals("mx.events.PropertyChangeEvent"))
-                    continue;
-                if (imp.equals("mx.events.PropertyChangeEventKind"))
-                    continue;
-                if (imp.equals("mx.core.DeferredInstanceFromFunction"))
-                    continue;
-    
-                if (NativeUtils.isNative(imp))
-                    continue;
-    
-                if (writtenInstances.indexOf(imp) == -1)
-                {
-                    emitHeaderLine(imp);
-                    writtenInstances.add(imp);
-                }
-            }
-        }
-
-        // erikdebruin: Add missing language feature support, like the 'is' and 
-        //              'as' operators. We don't need to worry about requiring
-        //              this in every project: ADVANCED_OPTIMISATIONS will NOT
-        //              include any of the code if it is not used in the project.
-        if (project.mainCU != null &&
-                cu.getName().equals(project.mainCU.getName()))
-        {
-            emitHeaderLine(JSFlexJSEmitterTokens.LANGUAGE_QNAME.getToken());
-        }
-
-        writeNewline();
-        writeNewline();
-    }
-
-    private void emitHeaderLine(String qname)
-    {
-        emitHeaderLine(qname, false);
-    }
-
-    private void emitHeaderLine(String qname, boolean isProvide)
-    {
-        write((isProvide) ? JSGoogEmitterTokens.GOOG_PROVIDE
-                : JSGoogEmitterTokens.GOOG_REQUIRE);
-        write(ASEmitterTokens.PAREN_OPEN);
-        write(ASEmitterTokens.SINGLE_QUOTE);
-        write(qname);
-        write(ASEmitterTokens.SINGLE_QUOTE);
-        write(ASEmitterTokens.PAREN_CLOSE);
-        writeNewline(ASEmitterTokens.SEMICOLON);
-    }
-
-    //--------------------------------------------------------------------------
-    //    Utils
-    //--------------------------------------------------------------------------
-
-    @Override
-    protected void emitAttributeValue(IASNode node)
-    {
-        IMXMLLiteralNode cnode = (IMXMLLiteralNode) node.getChild(0);
-
-        if (cnode.getValue() != null)
-            getMXMLWalker().walk((IASNode) cnode); // Literal
-    }
-
-    private MXMLVF2JSDescriptorSpecifier getCurrentDescriptor(String type)
-    {
-        MXMLVF2JSDescriptorSpecifier currentDescriptor = null;
-
-        int index;
-
-        if (type.equals("i"))
-        {
-            index = currentInstances.size() - 1;
-            if (index > -1)
-                currentDescriptor = currentInstances.get(index);
-        }
-        else
-        {
-            index = currentPropertySpecifiers.size() - 1;
-            if (index > -1)
-                currentDescriptor = currentPropertySpecifiers.get(index);
-        }
-
-        return currentDescriptor;
-    }
-
-    protected void moveDown(boolean byPass,
-            MXMLVF2JSDescriptorSpecifier currentInstance,
-            MXMLVF2JSDescriptorSpecifier currentPropertySpecifier)
-    {
-        if (!byPass)
-        {
-            if (currentInstance != null)
-                currentInstances.add(currentInstance);
-        }
-
-        if (currentPropertySpecifier != null)
-            currentPropertySpecifiers.add(currentPropertySpecifier);
-    }
-
-    protected void moveUp(boolean byPass, boolean isInstance)
-    {
-        if (!byPass)
-        {
-            int index;
-
-            if (isInstance)
-            {
-                index = currentInstances.size() - 1;
-                if (index > -1)
-                    currentInstances.remove(index);
-            }
-            else
-            {
-                index = currentPropertySpecifiers.size() - 1;
-                if (index > -1)
-                    currentPropertySpecifiers.remove(index);
-            }
-        }
-    }
-
-}