in compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java [1553:1838]
private void outputBindingInfoAsData(String cname, BindingDatabase bindingDataBase)
{
RoyaleJSProject project = (RoyaleJSProject)getMXMLWalker().getProject();
IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
.getASEmitter();
boolean allowDynamicBindings = project.config != null && project.config.getAllowDynamicBindings();
boolean useMxmlReflectObjectProperty = project.config != null && project.config.getMxmlReflectObjectProperty();
writeNewline("/**");
writeNewline(" * @export"); // must export or else GCC will remove it
writeNewline(" */");
writeNewline(formatQualifiedName(cname)
+ ".prototype._bindings = [");
if (bindingDataBase.getHasAncestorBindings()) {
//reference the ancestor binding data (which may in turn reference its owner's ancestor's bindings etc)
writeNewline(formatQualifiedName(bindingDataBase.getNearestAncestorWithBindings()) +
".prototype._bindings,");
}
Set<BindingInfo> bindingInfo = bindingDataBase.getBindingInfo();
writeNewline(bindingInfo.size() + ","); // number of bindings
boolean hadOutput = false;
for (BindingInfo bi : bindingInfo)
{
if (hadOutput)
{
writeNewline(ASEmitterTokens.COMMA);
}
hadOutput = true;
String s;
IMXMLNode node = bi.node;
if (node instanceof IMXMLSingleDataBindingNode)
{
IMXMLSingleDataBindingNode sbdn = (IMXMLSingleDataBindingNode)node;
IDefinition bdef = sbdn.getExpressionNode().resolve(project);
if (bdef != null)
{
//IDefinition cdef = bdef.getParent();
project.addExportedName(/*cdef.getQualifiedName() + "." + */bdef.getBaseName());
}
}
s = bi.getSourceString();
if (s == null && bi.isSourceSimplePublicProperty())
s = getSourceStringFromGetter(bi.getExpressionNodesForGetter());
if (!allowDynamicBindings || s == null || s.length() == 0)
{
List<IExpressionNode> getterNodes = bi.getExpressionNodesForGetter();
StringBuilder sb = new StringBuilder();
sb.append("/** @this {");
sb.append(formatQualifiedName(cname));
sb.append("} */\n");
sb.append("function() { return ");
int n = getterNodes.size();
for (int i = 0; i < n; i++)
{
IExpressionNode getterNode = getterNodes.get(i);
sb.append(asEmitter.stringifyNode(getterNode));
if (i < n - 1)
{
sb.append(ASEmitterTokens.SPACE.getToken());
sb.append(ASEmitterTokens.PLUS.getToken());
sb.append(ASEmitterTokens.SPACE.getToken());
}
}
sb.append("; },");
writeNewline(sb.toString());
}
else if (s.contains("."))
{
if (bi.classDef != null)
{
String[] parts = s.split("\\.");
String qname = bi.classDef.getQualifiedName();
write(ASEmitterTokens.SQUARE_OPEN);
write(ASEmitterTokens.DOUBLE_QUOTE);
write(qname);
write(ASEmitterTokens.DOUBLE_QUOTE);
usedNames.add(qname);
staticUsedNames.add(qname);
StringBuilder objString = null;
if (useMxmlReflectObjectProperty)
{
objString = new StringBuilder();
objString.append(qname);
}
int n = parts.length;
for (int i = 1; i < n; i++)
{
String part = parts[i];
write(", ");
if(useMxmlReflectObjectProperty)
{
write(JSGoogEmitterTokens.GOOG_REFLECT_OBJECTPROPERTY);
write(ASEmitterTokens.PAREN_OPEN);
}
write(ASEmitterTokens.DOUBLE_QUOTE);
write(part);
write(ASEmitterTokens.DOUBLE_QUOTE);
if(useMxmlReflectObjectProperty)
{
write(ASEmitterTokens.COMMA);
write(ASEmitterTokens.SPACE);
write(objString.toString());
write(ASEmitterTokens.PAREN_CLOSE);
objString.append(".");
objString.append(part);
}
}
write(ASEmitterTokens.SQUARE_CLOSE);
writeNewline(ASEmitterTokens.COMMA);
}
else
{
String[] parts = s.split("\\.");
write(ASEmitterTokens.SQUARE_OPEN);
StringBuilder objString = null;
if (useMxmlReflectObjectProperty)
{
objString = new StringBuilder();
objString.append("this");
}
int n = parts.length;
for (int i = 0; i < n; i++)
{
String part = parts[i];
if (i > 0)
{
write(", ");
}
if(useMxmlReflectObjectProperty)
{
write(JSGoogEmitterTokens.GOOG_REFLECT_OBJECTPROPERTY);
write(ASEmitterTokens.PAREN_OPEN);
}
write(ASEmitterTokens.DOUBLE_QUOTE);
write(part);
write(ASEmitterTokens.DOUBLE_QUOTE);
if(useMxmlReflectObjectProperty)
{
write(ASEmitterTokens.COMMA);
write(ASEmitterTokens.SPACE);
write(objString.toString());
write(ASEmitterTokens.PAREN_CLOSE);
objString.append(".");
objString.append(part);
}
}
write(ASEmitterTokens.SQUARE_CLOSE);
writeNewline(ASEmitterTokens.COMMA);
}
}
else
{
if(useMxmlReflectObjectProperty)
{
write(JSGoogEmitterTokens.GOOG_REFLECT_OBJECTPROPERTY);
write(ASEmitterTokens.PAREN_OPEN);
}
write(ASEmitterTokens.DOUBLE_QUOTE);
write(s);
write(ASEmitterTokens.DOUBLE_QUOTE);
if(useMxmlReflectObjectProperty)
{
write(ASEmitterTokens.COMMA);
write(ASEmitterTokens.SPACE);
write(ASEmitterTokens.THIS);
write(ASEmitterTokens.PAREN_CLOSE);
}
writeNewline(ASEmitterTokens.COMMA);
}
IExpressionNode destNode = bi.getExpressionNodeForDestination();
s = bi.getDestinationString();
if (!allowDynamicBindings && destNode == null && s != null)
{
StringBuilder sb = new StringBuilder();
sb.append("/** @this {");
sb.append(formatQualifiedName(cname));
sb.append("} */\n");
sb.append("function(value) { ");
sb.append("this.");
sb.append(s);
sb.append(" = value; },");
writeNewline(sb.toString());
s = null;
}
else if (destNode != null && s == null)
{
StringBuilder sb = new StringBuilder();
sb.append(generateSetterFunction(bi, destNode));
write(sb.toString());
writeNewline(ASEmitterTokens.COMMA);
}
else
{
write(ASEmitterTokens.NULL);
writeNewline(ASEmitterTokens.COMMA);
}
if (s == null)
{
write(ASEmitterTokens.NULL);
}
else if (s.contains("."))
{
String[] parts = s.split("\\.");
write(ASEmitterTokens.SQUARE_OPEN);
StringBuilder objString = null;
if (useMxmlReflectObjectProperty)
{
objString = new StringBuilder();
objString.append("this");
}
int n = parts.length;
for (int i = 0; i < n; i++)
{
String part = parts[i];
if (i > 0)
{
write(", ");
}
if(useMxmlReflectObjectProperty)
{
write(JSGoogEmitterTokens.GOOG_REFLECT_OBJECTPROPERTY);
write(ASEmitterTokens.PAREN_OPEN);
}
write(ASEmitterTokens.DOUBLE_QUOTE);
write(part);
write(ASEmitterTokens.DOUBLE_QUOTE);
if(useMxmlReflectObjectProperty)
{
write(ASEmitterTokens.COMMA);
write(ASEmitterTokens.SPACE);
write(objString.toString());
write(ASEmitterTokens.PAREN_CLOSE);
objString.append(".");
objString.append(part);
}
}
write(ASEmitterTokens.SQUARE_CLOSE);
}
else
{
if(useMxmlReflectObjectProperty)
{
write(JSGoogEmitterTokens.GOOG_REFLECT_OBJECTPROPERTY);
write(ASEmitterTokens.PAREN_OPEN);
}
write(ASEmitterTokens.DOUBLE_QUOTE);
write(s);
write(ASEmitterTokens.DOUBLE_QUOTE);
if(useMxmlReflectObjectProperty)
{
write(ASEmitterTokens.COMMA);
write(ASEmitterTokens.SPACE);
write(ASEmitterTokens.THIS);
write(ASEmitterTokens.PAREN_CLOSE);
}
writeNewline(ASEmitterTokens.COMMA);
}
}
Set<Entry<Object, WatcherInfoBase>> watcherChains = bindingDataBase.getWatcherChains();
if (watcherChains != null)
{
int count = watcherChains.size();
if (hadOutput) {
if (count > 0) writeNewline(ASEmitterTokens.COMMA);
else writeNewline();
}
for (Entry<Object, WatcherInfoBase> entry : watcherChains)
{
count--;
WatcherInfoBase watcherInfoBase = entry.getValue();
encodeWatcher(watcherInfoBase);
if (count > 0) writeNewline(ASEmitterTokens.COMMA);
}
} else {
if (hadOutput) writeNewline();
}
write(ASEmitterTokens.SQUARE_CLOSE);
writeNewline(ASEmitterTokens.SEMICOLON);
}