private void outputBindingInfoAsData()

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