private void emitComplexInitializers()

in compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java [3679:3884]


	private void emitComplexInitializers(IASNode node)
    {
        boolean wroteSelf = false;
        int n = node.getChildCount();
    	for (int i = 0; i < n; i++)
    	{
    		IASNode child = node.getChild(i);
    		if (child.getNodeID() == ASTNodeID.MXMLScriptID)
    		{
    			int m = child.getChildCount();
    			for (int j = 0; j < m; j++)
    			{
    				IASNode schild = child.getChild(j);
    				ASTNodeID schildID = schild.getNodeID();
    				if (schildID == ASTNodeID.VariableID ||
    						schildID == ASTNodeID.BindableVariableID)
    				{
    					IVariableNode varnode = (IVariableNode)schild;
    			        IExpressionNode vnode = varnode.getAssignedValueNode();

                        if (vnode != null && (!EmitterUtils.isScalar(vnode)))
    			        {
    	                    IDefinition varDef = varnode.getDefinition();
    	                    if (varDef.isStatic())
                            {
    	                    	continue;
                            }
                            if(!wroteSelf && vnode instanceof IFunctionObjectNode)
                            {
                                writeNewline();
                                writeToken(ASEmitterTokens.VAR);
                                writeToken(JSGoogEmitterTokens.SELF);
                                writeToken(ASEmitterTokens.EQUAL);
                                write(ASEmitterTokens.THIS);
                                writeNewline(ASEmitterTokens.SEMICOLON);
                                wroteSelf = true;
                            }
    	                    writeNewline();
    	                    write(ASEmitterTokens.THIS);
    	                    write(ASEmitterTokens.MEMBER_ACCESS);
    	                    JSRoyaleEmitter fjs = (JSRoyaleEmitter) ((IMXMLBlockWalker) getMXMLWalker())
    	                    .getASEmitter();
    	                    
    	                    ICompilerProject project = getMXMLWalker().getProject();
    	                    String qname = varnode.getName();
	                		if (varDef != null && varDef.isPrivate() && project.getAllowPrivateNameConflicts())
	                			qname = fjs.formatPrivateName(varDef.getParent().getQualifiedName(), qname);
	                        if (EmitterUtils.isCustomNamespace(varnode.getNamespace())) {
	                            INamespaceDecorationNode ns = ((VariableNode) varnode).getNamespaceNode();
	                            INamespaceDefinition nsDef = (INamespaceDefinition)ns.resolve(project);
	                            fjs.formatQualifiedName(nsDef.getQualifiedName()); // register with used names
	                            String s = nsDef.getURI();
	                            write(JSRoyaleEmitter.formatNamespacedProperty(s, qname, false));
	                        }
	                        else write(qname);
    	                    if (schildID == ASTNodeID.BindableVariableID && !varnode.isConst())
    	                    	write("_"); // use backing variable
    	                    write(ASEmitterTokens.SPACE);
    	                    writeToken(ASEmitterTokens.EQUAL);
                            IDefinition varTypeDef = null;
                            IExpressionNode variableTypeNode = varnode.getVariableTypeNode();
                            if (variableTypeNode != null)
                            {
                                varTypeDef = variableTypeNode.resolve(getMXMLWalker().getProject());
                            }
                            fjs.emitAssignmentCoercion(vnode, varTypeDef);
    	                    write(ASEmitterTokens.SEMICOLON);

    			        }
    				}
    			}
    		}
    	}
    	n = primitiveDeclarationNodes.size();
    	for (int i = 0; i < n; i++)
    	{
    		IMXMLInstanceNode declNode = primitiveDeclarationNodes.get(i);
    		ASTNodeID nodeId = declNode.getNodeID();
    		String varname;

    		switch (nodeId)
    		{
	    		case MXMLStringID:
	    		{
	    			IMXMLStringNode stringNode = (IMXMLStringNode)declNode;
                    IASNode expressionNode = stringNode.getExpressionNode();
                    // it might be a binding expression instead of a literal
                    if (expressionNode instanceof IMXMLLiteralNode)
                    {
                        varname = stringNode.getEffectiveID();
                        writeNewline();
                        write(ASEmitterTokens.THIS);
                        write(ASEmitterTokens.MEMBER_ACCESS);
                        write(varname);
                        write(ASEmitterTokens.SPACE);
                        writeToken(ASEmitterTokens.EQUAL);
                        IMXMLLiteralNode valueNode = (IMXMLLiteralNode) expressionNode;
                        Object value = valueNode.getValue();
                        write(objectToString(value));
                        write(ASEmitterTokens.SEMICOLON);
                    }
	                break;
	    		}
				case MXMLArrayID:
				{
					IMXMLArrayNode arrayNode = (IMXMLArrayNode)declNode;
                    int m = arrayNode.getChildCount();
                    boolean isDataBinding = false;
                    if(m == 1)
                    {
                        IASNode child = arrayNode.getChild(0);
                        isDataBinding = child instanceof IMXMLDataBindingNode;
                    }
                    if (!isDataBinding)
                    {
                        varname = arrayNode.getEffectiveID();
                        writeNewline();
                        write(ASEmitterTokens.THIS);
                        write(ASEmitterTokens.MEMBER_ACCESS);
                        write(varname);
                        write(ASEmitterTokens.SPACE);
                        writeToken(ASEmitterTokens.EQUAL);
                        write(ASEmitterTokens.SQUARE_OPEN);
                        boolean firstOne = true;
                        for (int j = 0; j < m; j++)
                        {
                            IMXMLInstanceNode valueNode = (IMXMLInstanceNode)(arrayNode.getChild(j));
                            if (firstOne)
                                firstOne = false;
                            else
                                writeToken(ASEmitterTokens.COMMA);
                            write(instanceToString(valueNode));
                        }
                        write(ASEmitterTokens.SQUARE_CLOSE);
                        write(ASEmitterTokens.SEMICOLON);
                    }
		            break;
				}
				case MXMLXMLID:
				{
					IMXMLXMLNode xmlNode = (IMXMLXMLNode)declNode;
					String valueString = xmlNode.getXMLString();
					if (valueString != null)
					{
						varname = xmlNode.getEffectiveID();
			            writeNewline();
			            write(ASEmitterTokens.THIS);
			            write(ASEmitterTokens.MEMBER_ACCESS);
			            write(varname);
			            write(ASEmitterTokens.SPACE);
			            writeToken(ASEmitterTokens.EQUAL);
			            write("new XML('");
				        write(StringEscapeUtils.escapeJavaScript(valueString));
			            write("')");
			            write(ASEmitterTokens.SEMICOLON);
					}
		            break;
				}
				case MXMLXMLListID:
				{
					IMXMLXMLListNode xmlNode = (IMXMLXMLListNode)declNode;
					String valueString = xmlNode.getXMLString();
					if (valueString != null)
					{
						varname = xmlNode.getEffectiveID();
			            writeNewline();
			            write(ASEmitterTokens.THIS);
			            write(ASEmitterTokens.MEMBER_ACCESS);
			            write(varname);
			            write(ASEmitterTokens.SPACE);
			            writeToken(ASEmitterTokens.EQUAL);
			            write("new XMLList('");
				        write(StringEscapeUtils.escapeJavaScript(valueString));
			            write("')");
			            write(ASEmitterTokens.SEMICOLON);
					}
		            break;
				}
	    		case MXMLBooleanID:
	    		case MXMLNumberID:
	    		case MXMLIntID:
	    		case MXMLUintID:
				{
	    			IMXMLExpressionNode scalarNode = (IMXMLExpressionNode)declNode;
                    IASNode expressionNode = scalarNode.getExpressionNode();
                    // it might be a binding expression instead of a literal
                    if (expressionNode instanceof IMXMLLiteralNode)
                    {
                        varname = scalarNode.getEffectiveID();
                        writeNewline();
                        write(ASEmitterTokens.THIS);
                        write(ASEmitterTokens.MEMBER_ACCESS);
                        write(varname);
                        write(ASEmitterTokens.SPACE);
                        writeToken(ASEmitterTokens.EQUAL);
                        IMXMLLiteralNode valueNode = (IMXMLLiteralNode) expressionNode;
                        Object value = valueNode.getValue();
                        write(value.toString());
                        write(ASEmitterTokens.SEMICOLON);
                    }
	                break;
				}

    		}
    	}
    }