You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by cd...@apache.org on 2016/04/13 20:55:57 UTC
[05/51] [partial] git commit: [flex-falcon]
[refs/heads/feature/maven-migration-test] - - Check-In of the migrated
project to make error analysis easier
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c3dce49f/compiler.js/src/org/apache/flex/compiler/internal/as/codegen/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