http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSMXMLClassDirectiveProcessor.java ---------------------------------------------------------------------- diff --git a/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSMXMLClassDirectiveProcessor.java b/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSMXMLClassDirectiveProcessor.java deleted file mode 100644 index 0f098cc..0000000 --- a/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSMXMLClassDirectiveProcessor.java +++ /dev/null @@ -1,1616 +0,0 @@ -package org.apache.flex.compiler.internal.as.codegen; - -import static org.apache.flex.abc.ABCConstants.CONSTANT_PrivateNs; -import static org.apache.flex.abc.ABCConstants.OP_applytype; -import static org.apache.flex.abc.ABCConstants.OP_callproperty; -import static org.apache.flex.abc.ABCConstants.OP_callpropvoid; -import static org.apache.flex.abc.ABCConstants.OP_construct; -import static org.apache.flex.abc.ABCConstants.OP_constructprop; -import static org.apache.flex.abc.ABCConstants.OP_dup; -import static org.apache.flex.abc.ABCConstants.OP_finddef; -import static org.apache.flex.abc.ABCConstants.OP_findpropstrict; -import static org.apache.flex.abc.ABCConstants.OP_getlex; -import static org.apache.flex.abc.ABCConstants.OP_getlocal0; -import static org.apache.flex.abc.ABCConstants.OP_getlocal3; -import static org.apache.flex.abc.ABCConstants.OP_getproperty; -import static org.apache.flex.abc.ABCConstants.OP_newarray; -import static org.apache.flex.abc.ABCConstants.OP_newobject; -import static org.apache.flex.abc.ABCConstants.OP_pushdouble; -import static org.apache.flex.abc.ABCConstants.OP_pushfalse; -import static org.apache.flex.abc.ABCConstants.OP_pushnull; -import static org.apache.flex.abc.ABCConstants.OP_pushstring; -import static org.apache.flex.abc.ABCConstants.OP_pushtrue; -import static org.apache.flex.abc.ABCConstants.OP_pushuint; -import static org.apache.flex.abc.ABCConstants.OP_setproperty; -import static org.apache.flex.abc.ABCConstants.TRAIT_Const; -import static org.apache.flex.abc.ABCConstants.TRAIT_Method; -import static org.apache.flex.abc.ABCConstants.TRAIT_Var; -import static org.apache.flex.compiler.mxml.IMXMLTypeConstants.ADD_EVENT_LISTENER_CALL_OPERANDS; -import static org.apache.flex.compiler.mxml.IMXMLTypeConstants.CREATE_XML_DOCUMENT_CALL_OPERANDS; -import static org.apache.flex.compiler.mxml.IMXMLTypeConstants.GET_INSTANCE_CALL_OPERANDS; -import static org.apache.flex.compiler.mxml.IMXMLTypeConstants.NAME_HANDLER_FUNCTION; -import static org.apache.flex.compiler.mxml.IMXMLTypeConstants.NAME_ID; -import static org.apache.flex.compiler.mxml.IMXMLTypeConstants.NAME_NAME; -import static org.apache.flex.compiler.mxml.IMXMLTypeConstants.NAME_OVERRIDES; -import static org.apache.flex.compiler.mxml.IMXMLTypeConstants.NAME_TARGET; -import static org.apache.flex.compiler.mxml.IMXMLTypeConstants.NAME_VALUE; -import static org.apache.flex.compiler.mxml.IMXMLTypeConstants.SET_STYLE_CALL_OPERANDS; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; - -import org.apache.flex.abc.ABCConstants; -import org.apache.flex.abc.instructionlist.InstructionList; -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.abc.semantics.Nsset; -import org.apache.flex.abc.semantics.Trait; -import org.apache.flex.abc.visitors.IABCVisitor; -import org.apache.flex.abc.visitors.ITraitVisitor; -import org.apache.flex.abc.visitors.ITraitsVisitor; -import org.apache.flex.compiler.common.ASModifier; -import org.apache.flex.compiler.constants.IASLanguageConstants; -import org.apache.flex.compiler.constants.IASLanguageConstants.BuiltinType; -import org.apache.flex.compiler.css.ICSSDocument; -import org.apache.flex.compiler.definitions.IDefinition; -import org.apache.flex.compiler.definitions.ITypeDefinition; -import org.apache.flex.compiler.exceptions.CodegenInterruptedException; -import org.apache.flex.compiler.internal.as.codegen.ICodeGenerator.IConstantValue; -import org.apache.flex.compiler.internal.as.codegen.MXMLClassDirectiveProcessor.Context; -import org.apache.flex.compiler.internal.as.codegen.MXMLClassDirectiveProcessor.IL; -import org.apache.flex.compiler.internal.caches.CSSDocumentCache; -import org.apache.flex.compiler.internal.css.codegen.CSSCompilationSession; -import org.apache.flex.compiler.internal.css.codegen.CSSEmitter; -import org.apache.flex.compiler.internal.css.codegen.CSSReducer; -import org.apache.flex.compiler.internal.definitions.ClassDefinition; -import org.apache.flex.compiler.internal.definitions.DefinitionBase; -import org.apache.flex.compiler.internal.definitions.FunctionDefinition; -import org.apache.flex.compiler.internal.definitions.NamespaceDefinition; -import org.apache.flex.compiler.internal.definitions.TypeDefinitionBase; -import org.apache.flex.compiler.internal.projects.FlexProject; -import org.apache.flex.compiler.internal.resourcebundles.ResourceBundleUtils; -import org.apache.flex.compiler.internal.scopes.ASProjectScope; -import org.apache.flex.compiler.internal.scopes.ASScope; -import org.apache.flex.compiler.internal.semantics.SemanticUtils; -import org.apache.flex.compiler.internal.tree.as.FunctionNode; -import org.apache.flex.compiler.internal.tree.as.NodeBase; -import org.apache.flex.compiler.internal.tree.as.VariableNode; -import org.apache.flex.compiler.mxml.IMXMLLanguageConstants; -import org.apache.flex.compiler.mxml.IMXMLTypeConstants; -import org.apache.flex.compiler.problems.CSSCodeGenProblem; -import org.apache.flex.compiler.problems.ICompilerProblem; -import org.apache.flex.compiler.problems.MXMLNotImplementedProblem; -import org.apache.flex.compiler.problems.MXMLOuterDocumentAlreadyDeclaredProblem; -import org.apache.flex.compiler.projects.ICompilerProject; -import org.apache.flex.compiler.projects.IFlexProject; -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.mxml.IMXMLArrayNode; -import org.apache.flex.compiler.tree.mxml.IMXMLBooleanNode; -import org.apache.flex.compiler.tree.mxml.IMXMLClassDefinitionNode; -import org.apache.flex.compiler.tree.mxml.IMXMLClassNode; -import org.apache.flex.compiler.tree.mxml.IMXMLClassReferenceNode; -import org.apache.flex.compiler.tree.mxml.IMXMLComponentNode; -import org.apache.flex.compiler.tree.mxml.IMXMLConcatenatedDataBindingNode; -import org.apache.flex.compiler.tree.mxml.IMXMLDeferredInstanceNode; -import org.apache.flex.compiler.tree.mxml.IMXMLDesignLayerNode; -import org.apache.flex.compiler.tree.mxml.IMXMLEffectSpecifierNode; -import org.apache.flex.compiler.tree.mxml.IMXMLEmbedNode; -import org.apache.flex.compiler.tree.mxml.IMXMLEventSpecifierNode; -import org.apache.flex.compiler.tree.mxml.IMXMLFactoryNode; -import org.apache.flex.compiler.tree.mxml.IMXMLFunctionNode; -import org.apache.flex.compiler.tree.mxml.IMXMLInstanceNode; -import org.apache.flex.compiler.tree.mxml.IMXMLIntNode; -import org.apache.flex.compiler.tree.mxml.IMXMLNode; -import org.apache.flex.compiler.tree.mxml.IMXMLNumberNode; -import org.apache.flex.compiler.tree.mxml.IMXMLObjectNode; -import org.apache.flex.compiler.tree.mxml.IMXMLPropertySpecifierNode; -import org.apache.flex.compiler.tree.mxml.IMXMLRegExpNode; -import org.apache.flex.compiler.tree.mxml.IMXMLRemoteObjectMethodNode; -import org.apache.flex.compiler.tree.mxml.IMXMLResourceNode; -import org.apache.flex.compiler.tree.mxml.IMXMLSingleDataBindingNode; -import org.apache.flex.compiler.tree.mxml.IMXMLStateNode; -import org.apache.flex.compiler.tree.mxml.IMXMLStringNode; -import org.apache.flex.compiler.tree.mxml.IMXMLStyleNode; -import org.apache.flex.compiler.tree.mxml.IMXMLStyleSpecifierNode; -import org.apache.flex.compiler.tree.mxml.IMXMLUintNode; -import org.apache.flex.compiler.tree.mxml.IMXMLVectorNode; -import org.apache.flex.compiler.tree.mxml.IMXMLWebServiceOperationNode; -import org.apache.flex.compiler.tree.mxml.IMXMLXMLListNode; -import org.apache.flex.compiler.tree.mxml.IMXMLXMLNode; -import org.apache.flex.compiler.units.ICompilationUnit; - -import com.google.common.base.Strings; - -/** - * {@link MXMLClassDirectiveProcessor} is a subclass of - * {@code ClassDirectiveProcessor} that generates an ABC class - * from an {@link IMXMLClassDefinitionNode} and its contents. - * - * Here are some register usage conventions for Code Generation: - * local3: during parts of the constructor, local3 is used for a - * lookup array of DeferredInstanceFromFunction. - * local1 and 2: Used during the constructor as temporaries - * for some data-binding init. - */ -public class JSMXMLClassDirectiveProcessor extends MXMLClassDirectiveProcessor -{ - /** - * Initialize the {@link MXMLClassDirectiveProcessor} and its - * associated AET data structures. - * @param d - the MXML document's AST. - * @param enclosingScope - the immediately enclosing lexical scope. - * @param emitter - the active ABC emitter. - */ - JSMXMLClassDirectiveProcessor(IMXMLClassDefinitionNode classDefinitionNode, - LexicalScope enclosingScope, IABCVisitor emitter) - { - super(classDefinitionNode, - enclosingScope, emitter); - - JSMXMLEmitter jsMXMLEmitter = (JSMXMLEmitter)emitter; - jsMXMLEmitter.register(this); - } - - /** - * A Map mapping an event node to the Name of the event handler - * method (>0, >1, etc.) associated with that node. - * <p> - * The handler method may or may not exist at the time - * that the handler name is assigned to the event node. - * For example, when a State tag appears before - * an instance tag with a state-dependent event, - * the name will get assigned and the code generated later. - * <p> - * This map is managed ONLY by getEventHandlerName(). - */ - private final Map<IMXMLEventSpecifierNode, Name> eventHandlerMap = - new HashMap<IMXMLEventSpecifierNode, Name>(); - - /** - * An incrementing counter used to create the names of the - * auto-generated event handler methods. - */ - private int eventHandlerCounter = 0; - - /** - * Autogenerated event handler methods are named $EH0, $EH1, etc. - * Using short names, and using the same names in each MXML document, - * decreases SWF size. - * Using a character that is not legal in ActionScript identifiers - * means that even if the event handler must be public - * (because it is referenced in a descriptor) - * the name will not collide with the name of a developer-written - * method and cannot be accessed from developer code. - */ - private static final String EVENT_HANDLER_NAME_BASE = "$EH"; - - private String NEWLINE = "\n"; - public ArrayList<Name> variableTraits; - private ArrayList<String> instanceData = new ArrayList<String>(); - public ArrayList<String> fragments = new ArrayList<String>(); - private FragmentList properties = new FragmentList(); - private FragmentList styles = new FragmentList(); - private FragmentList events = new FragmentList(); - private FragmentList children = new FragmentList(); - private FragmentList model = new FragmentList(); - private FragmentList beads = new FragmentList(); - private FragmentList currentList; - private boolean inContentFactory; - private String className; - - @Override - public void processMainClassDefinitionNode(IMXMLClassDefinitionNode node) - { - // Leave a reference to the class on the stack. - ClassDefinition classDefinition = - (ClassDefinition)((IMXMLClassDefinitionNode)node).getClassDefinition(); - className = classDefinition.getQualifiedName(); - currentList = properties; - super.processMainClassDefinitionNode(node); - } - - @Override - public void addVariableTrait(Name varName, Name varType) - { - if (variableTraits == null) - variableTraits = new ArrayList<Name>(); - variableTraits.add(varName); - variableTraits.add(varType); - } - - @Override - public void addBindableVariableTrait(Name varName, Name varType, IDefinition def) - { - String var = /*"_" + */varName.getBaseName(); - Name backingVar = new Name(new Namespace(JSSharedData.CONSTANT_PrivateNs), var); - variableTraits.add(backingVar); - variableTraits.add(varType); - - fragments.add("/**" - + NEWLINE + " * @this {" + className + "}" - + NEWLINE + " * @return {" + varType.getBaseName() + "}" - + NEWLINE + " */" - + NEWLINE + className + ".prototype.get_" + varName.getBaseName() + " = function()" - + NEWLINE + "{" - + NEWLINE + " return this." + var + ";" - + NEWLINE + "};"); - - fragments.add("/**" - + NEWLINE + " * @this {" + className + "}" - + NEWLINE + " * @param {" + varType.getBaseName() + "} value" - + NEWLINE + " */" - + NEWLINE + className + ".prototype.set_" + varName.getBaseName() + " = function(value)" - + NEWLINE + "{" - + NEWLINE + " if (value != this." + var + ")" - + NEWLINE + " this." + var + " = value;" - + NEWLINE + "};"); - } - - @Override - protected void processMXMLClassDefinition(IMXMLClassDefinitionNode node, Context context) - { - // Create the <Component> or <Definition> class. - MXMLClassDirectiveProcessor dp = new MXMLClassDirectiveProcessor(node, globalScope, emitter); - dp.processMainClassDefinitionNode(node); - dp.finishClassDefinition(); - } - - @Override - void setDocument(IMXMLClassReferenceNode node, boolean conditionally, Context context) - { - if (node.isVisualElementContainer() || node.isContainer()) - { - currentList.add("document"); - currentList.add(true); - currentList.addExplicit("this"); - } - } - - /** - * Adds the current set of childEvents, childStyles, and childProperties to currentList; - * @param context - * @param addCounters - * @param skipContentFactory - * @return - */ - @Override - int setSpecifiers(Context context, Boolean addCounters, Boolean skipContentFactory) - { - if (skipContentFactory) - return 0; - - int numProperties = properties.size() / 3; - if (context.hasBeads) - numProperties++; - if (context.hasModel) - numProperties++; - currentList.add(numProperties); - if (context.hasModel) - { - currentList.add("model"); - currentList.addObjectTypeMarker(); - currentList.addExplicit("[" + model.toString() + "]"); - } - currentList.addAll(properties); - if (context.hasBeads) - { - currentList.add("beads"); - currentList.addExplicit(beads.toString()); - } - currentList.add(styles.size() / 3); - currentList.addAll(styles); - currentList.add(events.size() / 2); - currentList.addAll(events); - if (children.size() == 0) - currentList.addNull(); - else - currentList.addExplicit("[" + children.toString() + "]"); - return (properties.size() + styles.size() + events.size()) / 3; - } - - @Override - void overrideMXMLDescriptorGetter(IMXMLClassDefinitionNode node, Context context) - { - // Leave a reference to the class on the stack. - ClassDefinition classDefinition = - (ClassDefinition)((IMXMLClassDefinitionNode)node).getClassDefinition(); - String className = classDefinition.getQualifiedName(); - - fragments.add("/**" - + NEWLINE + " * @override" - + NEWLINE + " * @this {" + className + "}" - + NEWLINE + " * @return {Array} the Array of UI element descriptors." - + NEWLINE + " */" - + NEWLINE + className + ".prototype.get_MXMLDescriptor = function()" - + NEWLINE + "{" - + NEWLINE + " if (this.mxmldd == undefined)" - + NEWLINE + " {" - + NEWLINE + " /** @type {Array} */" - + NEWLINE + " var arr = goog.base(this, 'get_MXMLDescriptor');" - + NEWLINE + " /** @type {Array} */" - + NEWLINE + " var data = " + addInstanceData() - + NEWLINE + " if (arr)" - + NEWLINE + " this.mxmldd = arr.concat(data);" - + NEWLINE + " else" - + NEWLINE + " this.mxmldd = data;" - + NEWLINE + " }" - + NEWLINE + " return this.mxmldd;" - + NEWLINE + "};"); - - } - - private String addInstanceData() - { - StringBuilder sb = new StringBuilder(); - sb.append("[" + NEWLINE); - int n = children.size(); - for (int i = 0; i < n; i++) - { - String s = children.get(i); - sb.append(s); - if (i < n - 1) - sb.append("," + NEWLINE); - else - sb.append(NEWLINE); - } - sb.append("];" + NEWLINE); - return sb.toString(); - } - - void overrideMXMLPropertiesGetter(IMXMLClassDefinitionNode node, Context context, int numElements) - { - // Leave a reference to the class on the stack. - ClassDefinition classDefinition = - (ClassDefinition)((IMXMLClassDefinitionNode)node).getClassDefinition(); - String className = classDefinition.getQualifiedName(); - - fragments.add("/**" - + NEWLINE + " * @override" - + NEWLINE + " * @this {" + className + "}" - + NEWLINE + " * @return {Array} the Array of UI element descriptors." - + NEWLINE + " */" - + NEWLINE + className + ".prototype.get_MXMLProperties = function()" - + NEWLINE + "{" - + NEWLINE + " if (this.mxmldp == undefined)" - + NEWLINE + " {" - + NEWLINE + " /** @type {Array} */" - + NEWLINE + " var arr = goog.base(this, 'get_MXMLProperties');" - + NEWLINE + " /** @type {Array} */" - + NEWLINE + " var data = " + addPropertiesData(context) - + NEWLINE + " if (arr)" - + NEWLINE + " this.mxmldp = arr.concat(data);" - + NEWLINE + " else" - + NEWLINE + " this.mxmldp = data;" - + NEWLINE + " }" - + NEWLINE + " return this.mxmldp;" - + NEWLINE + "};"); - - } - - private String addPropertiesData(Context context) - { - StringBuilder sb = new StringBuilder(); - sb.append("[" + NEWLINE); - int n = properties.size(); - int numProperties = n / 3; - if (context.hasModel) - numProperties++; - if (context.hasBeads) - numProperties++; - sb.append(new Integer(numProperties).toString() + ',' + NEWLINE); - if (context.hasModel) - { - sb.append("'model'"); - sb.append("," + NEWLINE); - sb.append(model.toString()); - sb.append("," + NEWLINE); - } - for (int i = 0; i < n; i++) - { - String s = properties.get(i); - sb.append(s); - sb.append("," + NEWLINE); - } - if (context.hasBeads) - { - sb.append("'beads'"); - sb.append("," + NEWLINE); - sb.append(beads.toString()); - sb.append("," + NEWLINE); - } - n = styles.size(); - sb.append(new Integer(n / 3).toString() + ',' + NEWLINE); - for (int i = 0; i < n; i++) - { - String s = styles.get(i); - sb.append(s); - sb.append("," + NEWLINE); - } - n = events.size(); - if (n == 0) - sb.append("0" + NEWLINE); - else - sb.append(new Integer(n / 2).toString() + ',' + NEWLINE); - for (int i = 0; i < n; i++) - { - String s = events.get(i); - sb.append(s); - if (i < n - 1) - sb.append("," + NEWLINE); - else - sb.append(NEWLINE); - } - sb.append("];" + NEWLINE); - return sb.toString(); - } - - @Override - void processMXMLBoolean(IMXMLBooleanNode booleanNode, Context context) - { - if (booleanNode.getParent().getNodeID() == ASTNodeID.MXMLPropertySpecifierID) - currentList.addSimpleTypeMarker(); // simple type - - boolean value = isDataBound(booleanNode) ? false : booleanNode.getValue(); - currentList.add(value); - traverse(booleanNode, context); - } - - @Override - void processMXMLInt(IMXMLIntNode intNode, Context context) - { - if (intNode.getParent().getNodeID() == ASTNodeID.MXMLPropertySpecifierID) - currentList.addSimpleTypeMarker(); // simple type - - int value = isDataBound(intNode) ? 0 : intNode.getValue(); - currentList.add(value); - traverse(intNode, context); - } - - @Override - void processMXMLUint(IMXMLUintNode uintNode, Context context) - { - if (uintNode.getParent().getNodeID() == ASTNodeID.MXMLPropertySpecifierID) - currentList.addSimpleTypeMarker(); // simple type - - long value = isDataBound(uintNode) ? 0 : uintNode.getValue(); - currentList.add(value); - traverse(uintNode, context); - } - - @Override - void processMXMLNumber(IMXMLNumberNode numberNode, Context context) - { - if (numberNode.getParent().getNodeID() == ASTNodeID.MXMLPropertySpecifierID) - currentList.addSimpleTypeMarker(); // simple type - - double value = isDataBound(numberNode) ? Double.NaN : numberNode.getValue(); - currentList.add(value); - traverse(numberNode, context); - } - - @Override - void processMXMLString(IMXMLStringNode stringNode, Context context) - { - if (stringNode.getParent().getNodeID() == ASTNodeID.MXMLPropertySpecifierID) - currentList.addSimpleTypeMarker(); // simple type - - String value = isDataBound(stringNode) ? null : stringNode.getValue(); - if (value != null) - currentList.add(value); - else - currentList.addNull(); - - traverse(stringNode, context); - } - - @Override - void processMXMLClass(IMXMLClassNode classNode, Context context) - { - MXMLNotImplementedProblem problem = new MXMLNotImplementedProblem(classNode, "MXML Class"); - getProblems().add(problem); - /* - // Don't call skipCodegen() because a null Class is represented - // by the expression node being null. - if (isDataBindingNode(classNode)) - return; - - IExpressionNode expressionNode = (IExpressionNode)classNode.getExpressionNode(); - if (expressionNode != null) - { - InstructionList init_expression = classScope.getGenerator().generateInstructions( - expressionNode, CmcEmitter.__expression_NT, this.classScope); - context.addAll(init_expression); - } - else - { - context.addInstruction(OP_pushnull); - } - */ - } - - /** - * Generates an instruction in the current context - * to push the value of an {@code IMXMLFunctionNode}. - * - * Will also generate the function, if the FunctionNode specifies a function expression. - * - * If no expression is provided in the function node, this will push null - */ - void processMXMLFunction(IMXMLFunctionNode functionNode, Context context) - { - MXMLNotImplementedProblem problem = new MXMLNotImplementedProblem(functionNode, "MXML Function"); - getProblems().add(problem); - /* - // Don't call skipCodegen() because a null Function is represented - // by the expression node being null. - if (isDataBindingNode(functionNode)) - return; - - IExpressionNode expressionNode = (IExpressionNode)functionNode.getExpressionNode(); - if (expressionNode != null) - { - InstructionList init_expression = classScope.getGenerator().generateInstructions( - expressionNode, CmcEmitter.__expression_NT, this.classScope); - context.addAll(init_expression); - } - else - { - context.addInstruction(OP_pushnull); - } - */ - } - - @Override - void processMXMLRegExp(IMXMLRegExpNode regexpNode, Context context) - { - MXMLNotImplementedProblem problem = new MXMLNotImplementedProblem(regexpNode, "MXML RegExp"); - getProblems().add(problem); - /* - // Don't call skipCodegen() because a parameterless RegExp is represented - // by the expression node being null. - if (isDataBindingNode(regexpNode)) - return; - - IExpressionNode expressionNode = (IExpressionNode)regexpNode.getExpressionNode(); - if (expressionNode != null ) - { - InstructionList init_expression = classScope.getGenerator().generateInstructions( - expressionNode, CmcEmitter.__expression_NT, this.classScope); - context.addAll(init_expression); - } - else - { - context.addInstruction(OP_findpropstrict, ABCGeneratingReducer.regexType); - context.addInstruction(OP_constructprop, new Object[] {ABCGeneratingReducer.regexType, 0}); - } - */ - } - - @Override - void processMXMLDesignLayer(IMXMLDesignLayerNode node, Context context) - { - MXMLNotImplementedProblem problem = new MXMLNotImplementedProblem(node, "MXML DesignLayer"); - getProblems().add(problem); - } - - @Override - void processMXMLWebServiceOperation(IMXMLWebServiceOperationNode node, Context context) - { - MXMLNotImplementedProblem problem = new MXMLNotImplementedProblem(node, "MXML WebServices"); - getProblems().add(problem); - } - - @Override - void processMXMLRemoteObjectMethod(IMXMLRemoteObjectMethodNode node, Context context) - { - MXMLNotImplementedProblem problem = new MXMLNotImplementedProblem(node, "MXML Remote Object"); - getProblems().add(problem); - } - - @Override - void processMXMLObject(IMXMLObjectNode objectNode, Context context) - { - FragmentList savedCurrentList = currentList; - currentList = new FragmentList(); - - traverse(objectNode, context); - - StringBuilder sb = new StringBuilder(); - sb.append("{"); - int n = currentList.size(); - for (int i = 0; i < n; i++) - { - String s = currentList.get(i++); - sb.append(s + ":"); - sb.append(currentList.get(i)); - if (i < n - 1) - sb.append(","); - } - sb.append("}"); - currentList = savedCurrentList; - currentList.addExplicit(sb.toString()); - } - - @Override - void processMXMLArray(IMXMLArrayNode arrayNode, Context context) - { - boolean savedMakingArrayValues = context.makingArrayValues; - - if (!inContentFactory) - { - if (context.parentContext.isStateDescriptor) - currentList.addArrayTypeMarker(); // array of descriptors - else - { - boolean isSimple = true; - - for (int i = 0; i < arrayNode.getChildCount(); i++) - { - final IASNode child = arrayNode.getChild(i); - ASTNodeID nodeID = child.getNodeID(); - if (nodeID == ASTNodeID.MXMLArrayID || nodeID == ASTNodeID.MXMLInstanceID) - { - isSimple = false; - break; - } - } - context.makingArrayValues = true; - if (isSimple) - currentList.addSimpleTypeMarker(); // arrays are simple values - else - currentList.addArrayTypeMarker(); - } - } - - FragmentList savedCurrentList = currentList; - currentList = new FragmentList(); - - traverse(arrayNode, context); - - FragmentList childList = currentList; - currentList = savedCurrentList; - - // TODO: can we do better? - // Now that stack will have the array children on it. - // But we may not have created one for every child of arrayNode. - // It would be best if we could remember how many we created, but - // we can't easily do that. So we use our "knowledge" that children - // are always created unless they are state dependent instances. - int nMax = arrayNode.getChildCount(); - int numStateDependentChildren=0; - for (int i=0; i<nMax; ++i) - { - IASNode ch = arrayNode.getChild(i); - if (isStateDependentInstance(ch)) - { - ++numStateDependentChildren; - } - } - - if (inContentFactory) - { - // pass the number of things we found up to the parent context. In spark controls - // the array of children is buried by a layer or two - currentList.addAll(childList); - } - else if (context.parentContext.isStateDescriptor) - { - StringBuilder sb = new StringBuilder(); - sb.append("["); - sb.append(childList.toString()); - sb.append("]"); - currentList.addExplicit(sb.toString()); - } - else if (context.makingArrayValues) - { - currentList.addAll(childList); - } - context.makingArrayValues = savedMakingArrayValues; - } - - @Override - void processMXMLVector(IMXMLVectorNode vectorNode, Context context) - { - MXMLNotImplementedProblem problem = new MXMLNotImplementedProblem(vectorNode, "MXML Vector"); - getProblems().add(problem); - } - - void processMXMLInstance(IMXMLInstanceNode instanceNode, Context context) - { - FragmentList savedList = currentList; - FragmentList savedProperties = properties; - FragmentList savedStyles = styles; - FragmentList savedEvents = events; - FragmentList savedChildren = children; - FragmentList savedBeads = beads; - FragmentList savedModel = model; - boolean savedHasBeads = context.hasBeads; - boolean savedHasModel = context.hasModel; - - properties = new FragmentList(); - styles = new FragmentList(); - events = new FragmentList(); - children = new FragmentList(); - beads = new FragmentList(); - model = new FragmentList(); - context.hasBeads = false; - context.hasModel = false; - - if (!context.isStateDescriptor && !inContentFactory && !context.parentContext.makingArrayValues) - currentList.addObjectTypeMarker(); // complex type - - traverse(instanceNode, context); - - int numElements = 0; - - currentList = properties; - - setDocument(instanceNode, false, context); - - // Sets the id property if the instance - // implements IDeferredInstantiationUIComponent. - String id = instanceNode.getID(); - if (id != null) - { - currentList.add("id"); - currentList.addSimpleTypeMarker(); - currentList.add(id); - } - else - { - id = instanceNode.getEffectiveID(); - if (id != null) - { - currentList.add("_id"); - currentList.addSimpleTypeMarker(); - currentList.add(id); - } - } - // bail out now. Other properties will be added in processMXMLState - if (context.isStateDescriptor) - return; - - - if (!inContentFactory) - currentList = new FragmentList(); - else - currentList = savedList; - - currentList.add(context.instanceClassName); - numElements += setSpecifiers(context, true, false); - - if (!inContentFactory) - { - StringBuilder sb = new StringBuilder(); - sb.append("["); - sb.append(currentList.toString()); - sb.append("]"); - currentList = savedList; - currentList.addExplicit(sb.toString()); - } - - currentList = savedList; - properties = savedProperties; - styles = savedStyles; - events = savedEvents; - children = savedChildren; - beads = savedBeads; - model = savedModel; - context.hasBeads = savedHasBeads; - context.hasModel = savedHasModel; - } - - @Override - void processMXMLFactory(IMXMLFactoryNode factoryNode, Context context) - { - // Get the Name for the mx.core.ClassFactory class. - ICompilerProject project = getProject(); - ClassDefinition classReference = (ClassDefinition)factoryNode.getClassReference(project); - Name factoryClassName = classReference.getMName(project); - - // Push this class. - currentList.add(factoryClassName); - - // Push the class to be used as the generator, - // by traversing the child MXMLClassNode. - traverse(factoryNode, context); - - // Call new ClassFactory(generator), leaving the new instance on the stack. - currentList.addExplicit("new " + factoryClassName.toString()); - } - - @Override - void processMXMLDeferredInstance(IMXMLDeferredInstanceNode deferredInstanceNode, Context context) - { - // Push the class or function to be used as the generator, - // by traversing the child MXMLClassNode or MXMLInstanceNode. - traverse(deferredInstanceNode, context); - } - - @Override - void processMXMLPropertySpecifier(IMXMLPropertySpecifierNode propertyNode, Context context) - { - // State-dependent nodes are handled by processMXMLState(). - if (isStateDependent(propertyNode)) - return; - - String propertyName = propertyNode.getName(); - - if (propertyName.equals("mxmlContentFactory") || propertyName.equals("mxmlContent")) - { - FragmentList savedList = currentList; - currentList = children; - inContentFactory = true; - - traverse(propertyNode, context); - - inContentFactory = false; - currentList = savedList; - } - else if (propertyName.equals("states")) - { - context.isStateDescriptor = true; - - FragmentList savedList = currentList; - currentList = properties; - - currentList.add(propertyName); - - traverse(propertyNode, context); - - currentList = savedList; - } - else if (propertyName.equals("model")) - { - context.hasModel = true; - - FragmentList savedList = currentList; - currentList = model; - - traverse(propertyNode, context); - - currentList = savedList; - } - else if (propertyName.equals("beads")) - { - context.hasBeads = true; - - FragmentList savedList = currentList; - currentList = beads; - boolean savedInContentFactory = inContentFactory; - inContentFactory = false; - - traverse(propertyNode, context); - - inContentFactory = savedInContentFactory; - currentList = savedList; - } - else - { - FragmentList savedList = currentList; - currentList = properties; - - currentList.add(propertyName); - - traverse(propertyNode, context); - - currentList = savedList; - } - } - - @Override - void processMXMLStyleSpecifier(IMXMLStyleSpecifierNode styleNode, Context context) - { - // State-dependent nodes are handled by processMXMLState(). - if (isStateDependent(styleNode)) - return; - - // Data bound styles don't need this processing either - IMXMLInstanceNode value = styleNode.getInstanceNode(); - if (isDataBindingNode(value)) - { - return; - } - - // Style specifiers on the class definition node - // generate code in the moduleFactory setter. - if (styleNode.getParent() instanceof IMXMLClassDefinitionNode) - { - FragmentList savedList = currentList; - currentList = styles; - - // Push the second argument: the value of the style. - // Do this by codegen'ing sole child, which is an IMXMLInstanceNode. - traverse(styleNode, context); - - currentList = savedList; - - } - - else - { - FragmentList savedList = currentList; - currentList = styles; - - String styleName = styleNode.getName(); - - // Push the first argument: the name of the style. - currentList.add(styleName); - - // Push the second argument: the value of the style. - // Do this by codegen'ing sole child, which is an IMXMLInstanceNode. - traverse(styleNode, context); - - currentList = savedList; - } - } - - @Override - void processMXMLEffectSpecifier(IMXMLEffectSpecifierNode effectNode, Context context) - { - MXMLNotImplementedProblem problem = new MXMLNotImplementedProblem(effectNode, "MXML Effect"); - getProblems().add(problem); - } - - @Override - void processMXMLEventSpecifier(IMXMLEventSpecifierNode eventNode, Context context) - { - // Event nodes (including state-dependent ones) - // generate a new event handler method. - // Create a MethodInfo and a method trait for the handler. - Name name = getEventHandlerName(eventNode); - MethodInfo methodInfo = createEventHandlerMethodInfo( - getProject(), eventNode, name.getBaseName()); - ITraitVisitor traitVisitor = - itraits.visitMethodTrait(TRAIT_Method, name, 0, methodInfo); - - // Use ABCGenerator to codegen the handler body from the - // ActionScript nodes that are the children of the event node. - classScope.getGenerator().generateMethodBodyForFunction( - methodInfo, eventNode, classScope, null); - - // Otherwise, state-dependent nodes are handled by processMXMLState(). - if (isStateDependent(eventNode)) - return; - - String eventName = eventNode.getName(); - Name eventHandler = getEventHandlerName(eventNode); - - FragmentList savedList = currentList; - currentList = events; - - currentList.add(eventName); - - currentList.addExplicit("this." + eventHandler.getBaseName()); - - currentList = savedList; - } - - @Override - void processMXMLResource(IMXMLResourceNode node, Context context) - { - MXMLNotImplementedProblem problem = new MXMLNotImplementedProblem(node, "MXML Resources"); - getProblems().add(problem); - } - - @Override - void processMXMLState(IMXMLStateNode stateNode, Context context) - { - int numElements = 1; - - context.isStateDescriptor = true; - - // First process the State node as an instance node, - // so that properties (name, stateGroups, basedOn) get set - // and event handlers (enterState, etc.) get set. - processMXMLInstance(stateNode, context); - - // Init the name property of the state (it's not a normal property specifier nodes - // TODO: should we make this a property node? - String name = stateNode.getStateName(); - if (name != null) - { - currentList.add("name"); - currentList.addSimpleTypeMarker(); - currentList.add(name); - } - - // In MXML 2009 and later, a state's 'overrides' property is implicitly - // determined by the nodes that are dependent on this state. - // We use these nodes to autogenerate runtime IOverride objects - // and set them as the value of the 'overrides' property. - IMXMLClassDefinitionNode classDefinitionNode = stateNode.getClassDefinitionNode(); - List<IMXMLNode> nodes = classDefinitionNode.getNodesDependentOnState(stateNode.getStateName()); - if (nodes != null) - { - currentList.add("overrides"); - currentList.addArrayTypeMarker(); // complex array - - // First step: process all instance overrides before any other overrides. - // why: because a) ensure instances exists before trying to apply property overrides - // b) because the old compiler did - // Do it in reverse order - // a) because the way old compiler generated destination and relativeTo - // properties relies on doing it backwards. - // - // Each one will generate code to push an IOverride instance. - for (int i=nodes.size()-1; i>=0; --i) - { - IMXMLNode node = nodes.get(i); - if (node.getNodeID() == ASTNodeID.MXMLInstanceID) - { - processInstanceOverride((IMXMLInstanceNode)node, context); - } - } - // Next process the non-instance overrides dependent on this state. - // Each one will generate code to push an IOverride instance. - for (IMXMLNode node : nodes) - { - switch (node.getNodeID()) - { - case MXMLPropertySpecifierID: - { - processPropertyOverride((IMXMLPropertySpecifierNode)node, context); - break; - } - case MXMLStyleSpecifierID: - { - processStyleOverride((IMXMLStyleSpecifierNode)node, context); - break; - } - case MXMLEventSpecifierID: - { - processEventOverride((IMXMLEventSpecifierNode)node, context); - break; - } - } - } - - numElements += setSpecifiers(context, true, false); - } - } - - @Override - void processPropertyOrStyleOverride(Name overrideName, IMXMLPropertySpecifierNode propertyOrStyleNode, Context context) - { - IASNode parentNode = propertyOrStyleNode.getParent(); - String id = parentNode instanceof IMXMLInstanceNode ? - ((IMXMLInstanceNode)parentNode).getEffectiveID() : - ""; - - String name = propertyOrStyleNode.getName(); - - IMXMLInstanceNode propertyOrStyleValueNode = propertyOrStyleNode.getInstanceNode(); - - // Construct the SetProperty or SetStyle object. - currentList.add(overrideName); - - currentList.add(3); - // Set its 'target' property to the id of the object - // whose property or style this override will set. - currentList.add("target"); - currentList.addSimpleTypeMarker(); - currentList.add(id); - - // Set its 'name' property to the name of the property or style. - currentList.add("name"); - currentList.addSimpleTypeMarker(); - currentList.add(name); - - // Set its 'value' property to the value of the property or style. - currentList.add("value"); - processNode(propertyOrStyleValueNode, context); // push value - - currentList.add(0); // styles - currentList.add(0); // effects - currentList.add(0); // events - currentList.addNull(); // children - } - - /** - * 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 processEventOverride(IMXMLEventSpecifierNode eventNode, Context context) - { - FlexProject project = getProject(); - Name eventOverride = project.getEventOverrideClassName(); - - IASNode parentNode = eventNode.getParent(); - String id = parentNode instanceof IMXMLInstanceNode ? - ((IMXMLInstanceNode)parentNode).getEffectiveID() : - ""; - - String name = eventNode.getName(); - - Name eventHandler = getEventHandlerName(eventNode); - - // Construct the SetEventHandler object. - currentList.add(eventOverride); - currentList.add(3); - - // Set its 'target' property to the id of the object - // whose event this override will set. - currentList.add(NAME_TARGET); - currentList.addSimpleTypeMarker(); - currentList.add(id); - - // Set its 'name' property to the name of the event. - currentList.add(NAME_NAME); - currentList.addSimpleTypeMarker(); - currentList.add(name); - - // Set its 'handlerFunction' property to the autogenerated event handler. - currentList.add(NAME_HANDLER_FUNCTION); - currentList.addSimpleTypeMarker(); - currentList.add(eventHandler); - } - - /** - * Generates instructions in the current context - * to create an instance of mx.states.AddItems... - * - * Assumes lookup table is still in local3 - */ - - void processInstanceOverride(IMXMLInstanceNode instanceNode, Context context) - { - FlexProject project = getProject(); - Name instanceOverrideName = project.getInstanceOverrideClassName(); - - currentList.add(instanceOverrideName); - - // Now set properties on it! - - //---------------------------------------------------------------------- - // First property: set itemsFactory to the deferredInstanceFunction we created earlier - Integer index = nodeToIndexMap.get(instanceNode); - assert index != null; - - FragmentList addItemsList = new FragmentList(); - addItemsList.add("itemsDescriptor"); - addItemsList.addSimpleTypeMarker(); // the value is an array of descriptor data that will be parsed later - FragmentList savedList = currentList; - currentList = new FragmentList(); - InstructionList il = nodeToInstanceDescriptorMap.get(instanceNode); - addItemsList.addExplicit("[" + currentList.toString() + "]"); - currentList = savedList; - - //----------------------------------------------------------------------------- - // 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(); - - - addItemsList.add("destination"); - addItemsList.addSimpleTypeMarker(); // simple type - addItemsList.add(parentId); - addItemsList.add("propertyName"); - addItemsList.addSimpleTypeMarker(); // simple type - addItemsList.add(propName); - } - } - - //--------------------------------------------------------------- - // 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(); - } - - addItemsList.add("position"); - addItemsList.addSimpleTypeMarker(); // simple type - addItemsList.add(positionPropertyValue); - - // relativeTo - if (relativeToPropertyValue != null) - { - addItemsList.add("relativeTo"); - addItemsList.addSimpleTypeMarker(); // simple type - addItemsList.add(relativeToPropertyValue); - } - - currentList.add(addItemsList.size() / 3); - currentList.addAll(addItemsList); - currentList.add(0); // styles - currentList.add(0); // effects - currentList.add(0); // events - currentList.addNull(); // children - } - - void processMXMLComponent(IMXMLComponentNode node, Context context) - { - // Resolve the outer document, and if it doesn't resolve to the contingent - // definition, that means there is already an existing definition declared - // which is an error. - ClassDefinition componentClass = (ClassDefinition)node.getContainedClassDefinition(); - ASScope classScope = componentClass.getContainedScope(); - IDefinition outerDocument = classScope.getPropertyFromDef( - getProject(), componentClass, IMXMLLanguageConstants.PROPERTY_OUTER_DOCUMENT, false); - assert (outerDocument != null) : "outerDocument should never be null, as always added"; - if (!outerDocument.isContingent()) - { - ICompilerProblem problem = new MXMLOuterDocumentAlreadyDeclaredProblem(outerDocument); - getProblems().add(problem); - } - - // Process the MXMLComponentNode as an MXMLFactoryNode, which it extends. - // This leaves a ClassFactory on the stack. - processMXMLFactory(node, context); - - // factory.properties = { outerDocument: this } - currentList.add(IMXMLTypeConstants.NAME_PROPERTIES); - currentList.addSimpleTypeMarker(); - currentList.addExplicit("{" + IMXMLLanguageConstants.PROPERTY_OUTER_DOCUMENT + ": this}"); - } - - void processMXMLEmbed(IMXMLEmbedNode node, Context context) - { - MXMLNotImplementedProblem problem = new MXMLNotImplementedProblem(node, "MXML Embedding"); - getProblems().add(problem); - } - - void processMXMLXML(IMXMLXMLNode node, Context context) - { - MXMLNotImplementedProblem problem = new MXMLNotImplementedProblem(node, "MXML XML"); - getProblems().add(problem); - } - - void processMXMLXMLList(IMXMLXMLListNode node, Context context) - { - MXMLNotImplementedProblem problem = new MXMLNotImplementedProblem(node, "MXML XMLList"); - getProblems().add(problem); - } - - /** - * Copied from JSClassDirectiveProcessor - * Declare a function. TODO: static vs. instance. - */ - @Override - void declareFunction(FunctionNode func) - { - func.parseFunctionBody(classScope.getProblems()); - - boolean is_constructor = func.isConstructor(); - - functionSemanticChecks(func); - - // Save the constructor function until - // we've seen all the instance variables - // that might need initialization. - if (is_constructor) - { - this.ctorFunction = func; - } - else - { - MethodInfo mi = classScope.getGenerator().generateFunction(func, classScope, null); - ITraitVisitor tv; - - if (mi != null) - { - FunctionDefinition funcDef = func.getDefinition(); - Name funcName = funcDef.getMName(classScope.getProject()); - - if (func.hasModifier(ASModifier.STATIC)) - tv = ctraits.visitMethodTrait(functionTraitKind(func, TRAIT_Method), funcName, 0, mi); - else - { - tv = itraits.visitMethodTrait(functionTraitKind(func, TRAIT_Method), funcName, 0, mi); - if (funcDef.getNamespaceReference() instanceof NamespaceDefinition.IProtectedNamespaceDefinition) - this.iinfo.flags |= ABCConstants.CLASS_FLAG_protected; - } - - this.classScope.processMetadata(tv, funcDef.getAllMetaTags()); - - if (func.hasModifier(ASModifier.FINAL)) - tv.visitAttribute(Trait.TRAIT_FINAL, Boolean.TRUE); - if (func.hasModifier(ASModifier.OVERRIDE)) - tv.visitAttribute(Trait.TRAIT_OVERRIDE, Boolean.TRUE); - } - } - } - - /** - * Copied from JSClassDirectiveProcessor - * Declare a variable. TODO: static vs. instance. - */ - @Override - void declareVariable(VariableNode var) - { - verifyVariableModifiers(var); - - DefinitionBase varDef = var.getDefinition(); - JSGenerator jsGenerator = (JSGenerator)classScope.getGenerator(); - jsGenerator.getReducer().startDeclareVariable(varDef); - - boolean is_static = var.hasModifier(ASModifier.STATIC); - boolean is_const = SemanticUtils.isConst(var, classScope.getProject()); - // simple initializers for public/protected vars go right on prototype. - // the rest (all private vars), all "complex" initializers (like array) get - // initialized in the constructor - boolean needs_constructor_init = true; - - // generateConstantValue() returns null if no constant value - // can be generated, and null is the correct value for "no value." - IConstantValue constantValue = jsGenerator.generateConstantValue(var.getAssignedValueNode(), this.classScope.getProject()); - - // initializer is null if no constant value - // can be generated, and null is the correct value for "no value." - Object initializer = constantValue != null ? constantValue.getValue() : null; - - ITraitVisitor tv = declareVariable(var, varDef, is_static, is_const, initializer); - - this.classScope.processMetadata(tv, varDef.getAllMetaTags()); - - // Generate variable initializers and append them to the - // proper initialization list. - if (var.getChildCount() > 1) - { - // We need to put the correct traits visitor on the class' - // LexicalScope; the BURM may encounter variable declarations - // chained onto this one, and it will need the traits visitor to declare them. - - // Save the scope's current traits visitor (which should be null) - // and restore it - ITraitsVisitor saved_traits_visitor = this.classScope.traitsVisitor; - assert (saved_traits_visitor == null); - try - { - // the following line causes duplicate Traits. - // JSEmitter::emitTraits works around duplicate Traits by checking against - // a visitedTraits set. - this.classScope.traitsVisitor = (is_static) ? ctraits : itraits; - this.classScope.resetDebugInfo(); - InstructionList init_expression = jsGenerator.generateInstructions(var, CmcJSEmitter.__statement_NT, this.classScope); - if (init_expression != null && !init_expression.isEmpty()) - { - // final JSEmitter emitter = (JSEmitter)this.classScope.getEmitter(); - final String str = JSGeneratingReducer.instructionListToString(init_expression, true); - - if (str.contains(" = ")) - { - final String varInit = jsGenerator.getReducer().getVariableInitializer(varDef); - if (varInit != null && !varInit.isEmpty()) - { - // set the value of the slot trait. - final String varName = varDef.getBaseName(); - for (Trait t : this.classScope.traitsVisitor.getTraits()) - { - final byte kind = t.getKind(); - if (kind == TRAIT_Const || kind == TRAIT_Var) - { - boolean is_private = false; - final Name name = t.getNameAttr(Trait.TRAIT_NAME); - Namespace ns = name.getSingleQualifier(); - if (ns.getKind() == CONSTANT_PrivateNs) - is_private = true; - if (name.getBaseName().equals(varName)) - { - t.setAttr(Trait.SLOT_VALUE, varInit); - if (!is_private) - needs_constructor_init = false; - break; - } - } - } - - } - - if (is_static) - { - // see finishClassDefinition. - // We clear cinitInsns only if there are no side effects - // by initializing the static members directly. - // If varInit is null, or varInit is isEmpty() - // then we have side effects. - if (!init_expression.isEmpty()) - registerClassInit(var); - - cinitInsns.addAll(init_expression); - } - else if (needs_constructor_init) - iinitInsns.addAll(init_expression); - } - } - } - finally - { - this.classScope.traitsVisitor = saved_traits_visitor; - } - } - - jsGenerator.getReducer().endDeclareVariable(varDef); - } - - private void registerClassInit(IASNode node) - { - final String fullName = JSGeneratingReducer.createFullNameFromDefinition(classScope.getProject(), classDefinition); - if (!fullName.equals(JSSharedData.JS_FRAMEWORK_NAME)) - { - JSGenerator jsGenerator = (JSGenerator)classScope.getGenerator(); - JSSharedData.instance.registerClassInit(fullName); - jsGenerator.getReducer().warnClassInitPerformance(node); - jsGenerator.getReducer().setNeedsSecondPass(); - } - } - - /** - * Determines the Name of the event handler method for an event node. - * This can get called to preassign the name before the method gets generated. - */ - protected Name getEventHandlerName(IMXMLEventSpecifierNode eventNode) - { - // Check the map to see if a handler name - // has already been assigned to this event node. - Name name = eventHandlerMap.get(eventNode); - - // If so, return it. - if (name != null) - return name; - - // Otherwise, generate the next one in the sequence "$EH0", "$EH1", etc. - String baseName = EVENT_HANDLER_NAME_BASE + eventHandlerCounter++; - - name = new Name(baseName); - - // Remember it in the map. - eventHandlerMap.put(eventNode, name); - - return name; - } - - static class FragmentList - { - ArrayList<String> list = new ArrayList<String>(); - - void add(boolean value) - { - if (value) - list.add("true"); - else - list.add("false"); - } - - void add(int value) - { - list.add(new Integer(value).toString()); - } - - void add(long value) - { - list.add(new Long(value).toString()); - } - - void add(double value) - { - list.add(new Double(value).toString()); - } - - void add(Name name) - { - StringBuilder sb = new StringBuilder(); - String s = name.getSingleQualifier().getName(); - if (s.length() > 0) - { - sb.append(s); - sb.append("."); - } - sb.append(name.getBaseName()); - list.add(sb.toString()); - } - - void add(String string) - { - list.add("'" + string + "'"); - } - - void addExplicit(String string) - { - list.add(string); - } - - void addAll(FragmentList addlist) - { - list.addAll(addlist.list); - } - - void addSimpleTypeMarker() - { - list.add("true"); - } - - void addObjectTypeMarker() - { - list.add("false"); - } - - void addArrayTypeMarker() - { - list.add("null"); - } - - void addNull() - { - list.add("null"); - } - - int size() - { - return list.size(); - } - - String get(int i) - { - return list.get(i); - } - - public String toString() - { - StringBuilder sb = new StringBuilder(); - int n = list.size(); - for (int i = 0; i < n; i++) - { - sb.append(list.get(i)); - if (i < n - 1) - sb.append(", "); - } - return sb.toString(); - } - - } -}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSMXMLEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSMXMLEmitter.java b/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSMXMLEmitter.java deleted file mode 100644 index 54e4cc8..0000000 --- a/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/JSMXMLEmitter.java +++ /dev/null @@ -1,157 +0,0 @@ -package org.apache.flex.compiler.internal.as.codegen; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; - -import org.apache.flex.abc.semantics.InstanceInfo; -import org.apache.flex.abc.semantics.MethodInfo; -import org.apache.flex.abc.semantics.Name; -import org.apache.flex.compiler.definitions.IClassDefinition; -import org.apache.flex.compiler.definitions.IDefinition; -import org.apache.flex.compiler.definitions.IPackageDefinition; -import org.apache.flex.compiler.internal.as.codegen.JSEmitter.EmitterClassVisitor; -import org.apache.flex.compiler.internal.definitions.ClassDefinition; -import org.apache.flex.compiler.internal.projects.FlexJSProject; -import org.apache.flex.compiler.internal.scopes.ASProjectScope; -import org.apache.flex.compiler.projects.ICompilerProject; -import org.apache.flex.compiler.scopes.IASScope; -import org.apache.flex.compiler.units.ICompilationUnit; -import org.apache.flex.compiler.units.ICompilationUnit.Operation; - -class JSMXMLEmitter extends JSEmitter -{ - - public JSMXMLEmitter(JSSharedData sharedData, Operation buildPhase, - ICompilerProject project, JSGenerator generator) { - super(sharedData, buildPhase, project, generator); - // TODO Auto-generated constructor stub - } - - private JSMXMLClassDirectiveProcessor cdp; - private String NEWLINE = "\n"; - - public void register(JSMXMLClassDirectiveProcessor cdp) - { - this.cdp = cdp; - } - - @Override - public byte[] emit() - { - try { - generateClass(); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return w.toByteArray(); - } - - private void generateClass() throws Exception - { - ClassDefinition definition = cdp.classDefinition; - IClassDefinition superClass = (ClassDefinition)definition.resolveBaseClass(cdp.getProject()); - String classQName = definition.getQualifiedName(); - writeString("goog.provide('" + classQName + "');" + NEWLINE); - writeString(NEWLINE); - /* - String[] list = definition.getImplicitImports(); - ArrayList<String> imps = new ArrayList<String>(Arrays.asList(list)); - imps.add(superClass.getQualifiedName()); - Collections.sort(imps); - for (String imp : imps) - { - if (imp.indexOf("__AS3__") != -1) - continue; - writeString("goog.require('" + imp + "');"); - writeString(NEWLINE); - } - writeString(NEWLINE); - */ - FlexJSProject project = (FlexJSProject)m_project; - ASProjectScope projectScope = (ASProjectScope) m_project.getScope(); - ICompilationUnit cu = projectScope.getCompilationUnitForDefinition(definition); - ArrayList<String> deps = project.getRequires(cu); - emitRequires(deps, classQName); - - writeString("/**" + NEWLINE); - writeString(" * @constructor" + NEWLINE); - if (superClass != null) - writeString(" * @extends {" + superClass.getQualifiedName() + "}" + NEWLINE); - writeString(" */" + NEWLINE); - writeString(definition.getQualifiedName() + " = function() {" + NEWLINE); - if (superClass != null) - writeString(" " + superClass.getQualifiedName() + ".call(this);" + NEWLINE); - - for (int i = 0; i < cdp.variableTraits.size(); i += 2) - { - writeString(NEWLINE); - Name name = cdp.variableTraits.get(i); - Name type = cdp.variableTraits.get(i + 1); - writeString(" /**" + NEWLINE); - writeString(" * @private" + NEWLINE); - writeString(" * @type {"); - String ns = type.getSingleQualifier().getName(); - if (ns.length() > 0) - { - writeString(ns); - writeString("."); - } - writeString(type.getBaseName()); - writeString("}" + NEWLINE); - writeString(" */" + NEWLINE); - writeString(" this." + name.getBaseName() + ";"); - writeString(NEWLINE); - } - writeString("};" + NEWLINE); - - if (superClass != null) - { - writeString("goog.inherits(" + definition.getQualifiedName() + ", " - + superClass.getQualifiedName() + ");" + NEWLINE); - writeString(NEWLINE); - } - - // write out instance traits for script block - for (EmitterClassVisitor clz : this.definedClasses) - { - InstanceInfo ii = clz.instanceInfo; - - // Skipping classes that are "marked" as IExtern. - final Boolean isExtern = isExtern(ii); - if (isExtern) - return; - - final Boolean isInterface = ii.isInterface(); - final Boolean isPackageFunction = ii.name == null; - - String packageName; - String className; - if (ii.name != null) - { - final IDefinition def = getDefinition(ii.name); - packageName = def.getPackageName(); - className = JSGeneratingReducer.getBasenameFromName(ii.name); - } - else - { - packageName = m_packageName; - className = ""; - } - // register class with super class - final IDefinition superClassDef = getDefinition(ii.superName); - final String superClassName = superClassDef == null ? "Object" : superClassDef.getQualifiedName(); - emitTraits(clz.instanceTraits, true, isExtern, isInterface, isPackageFunction, (MethodInfo)null, packageName, className, superClassName, "this.", "", ",", "\t"); - } - writeString(NEWLINE); - writeString(NEWLINE); - - for (String s : cdp.fragments) - { - writeString(s); - writeString(NEWLINE); - writeString(NEWLINE); - } - } -} \ No newline at end of file