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