Search in sources :

Example 1 with IMXMLSingleDataBindingNode

use of org.apache.flex.compiler.tree.mxml.IMXMLSingleDataBindingNode in project vscode-nextgenas by BowlerHatLLC.

the class ActionScriptTextDocumentService method getEmbeddedActionScriptNodeInMXMLTag.

private IASNode getEmbeddedActionScriptNodeInMXMLTag(IMXMLTagData tag, int offset, TextDocumentPositionParams position) {
    IMXMLTagAttributeData attributeData = getMXMLTagAttributeWithValueAtOffset(tag, currentOffset);
    if (attributeData != null) {
        //some attributes can have ActionScript completion, such as
        //events and properties with data binding
        IClassDefinition tagDefinition = (IClassDefinition) currentProject.resolveXMLNameToDefinition(tag.getXMLName(), tag.getMXMLDialect());
        IDefinition attributeDefinition = currentProject.resolveSpecifier(tagDefinition, attributeData.getShortName());
        if (attributeDefinition instanceof IEventDefinition) {
            IMXMLInstanceNode mxmlNode = (IMXMLInstanceNode) getOffsetNode(position);
            IMXMLEventSpecifierNode eventNode = mxmlNode.getEventSpecifierNode(attributeData.getShortName());
            for (IASNode asNode : eventNode.getASNodes()) {
                IASNode containingNode = getContainingNodeIncludingStart(asNode, currentOffset);
                if (containingNode != null) {
                    return containingNode;
                }
            }
            return eventNode;
        } else {
            IASNode offsetNode = getOffsetNode(position);
            if (offsetNode instanceof IMXMLInstanceNode) {
                IMXMLInstanceNode instanceNode = (IMXMLInstanceNode) offsetNode;
                IMXMLPropertySpecifierNode propertyNode = instanceNode.getPropertySpecifierNode(attributeData.getShortName());
                if (propertyNode != null) {
                    for (int i = 0, count = propertyNode.getChildCount(); i < count; i++) {
                        IMXMLNode propertyChild = (IMXMLNode) propertyNode.getChild(i);
                        if (propertyChild instanceof IMXMLConcatenatedDataBindingNode) {
                            IMXMLConcatenatedDataBindingNode dataBinding = (IMXMLConcatenatedDataBindingNode) propertyChild;
                            for (int j = 0, childCount = dataBinding.getChildCount(); j < childCount; j++) {
                                IASNode dataBindingChild = dataBinding.getChild(i);
                                if (dataBindingChild.contains(currentOffset) && dataBindingChild instanceof IMXMLSingleDataBindingNode) {
                                    //we'll parse this in a moment, as if it were
                                    //a direct child of the property specifier
                                    propertyChild = (IMXMLSingleDataBindingNode) dataBindingChild;
                                    break;
                                }
                            }
                        }
                        if (propertyChild instanceof IMXMLSingleDataBindingNode) {
                            IMXMLSingleDataBindingNode dataBinding = (IMXMLSingleDataBindingNode) propertyChild;
                            IASNode containingNode = dataBinding.getExpressionNode().getContainingNode(currentOffset);
                        //we found the correct expression, but due to a bug
                        //in the compiler its line and column positions
                        //will be wrong. the resulting completion is too
                        //quirky, so this feature will be completed later.
                        //return containingNode;
                        }
                    }
                }
            }
        //nothing possible for this attribute
        }
    }
    return null;
}
Also used : IMXMLConcatenatedDataBindingNode(org.apache.flex.compiler.tree.mxml.IMXMLConcatenatedDataBindingNode) IMXMLEventSpecifierNode(org.apache.flex.compiler.tree.mxml.IMXMLEventSpecifierNode) IClassDefinition(org.apache.flex.compiler.definitions.IClassDefinition) IMXMLInstanceNode(org.apache.flex.compiler.tree.mxml.IMXMLInstanceNode) IASNode(org.apache.flex.compiler.tree.as.IASNode) IMXMLSingleDataBindingNode(org.apache.flex.compiler.tree.mxml.IMXMLSingleDataBindingNode) IMXMLPropertySpecifierNode(org.apache.flex.compiler.tree.mxml.IMXMLPropertySpecifierNode) IEventDefinition(org.apache.flex.compiler.definitions.IEventDefinition) IDefinition(org.apache.flex.compiler.definitions.IDefinition) IMXMLNode(org.apache.flex.compiler.tree.mxml.IMXMLNode) IMXMLTagAttributeData(org.apache.flex.compiler.mxml.IMXMLTagAttributeData)

Aggregations

IClassDefinition (org.apache.flex.compiler.definitions.IClassDefinition)1 IDefinition (org.apache.flex.compiler.definitions.IDefinition)1 IEventDefinition (org.apache.flex.compiler.definitions.IEventDefinition)1 IMXMLTagAttributeData (org.apache.flex.compiler.mxml.IMXMLTagAttributeData)1 IASNode (org.apache.flex.compiler.tree.as.IASNode)1 IMXMLConcatenatedDataBindingNode (org.apache.flex.compiler.tree.mxml.IMXMLConcatenatedDataBindingNode)1 IMXMLEventSpecifierNode (org.apache.flex.compiler.tree.mxml.IMXMLEventSpecifierNode)1 IMXMLInstanceNode (org.apache.flex.compiler.tree.mxml.IMXMLInstanceNode)1 IMXMLNode (org.apache.flex.compiler.tree.mxml.IMXMLNode)1 IMXMLPropertySpecifierNode (org.apache.flex.compiler.tree.mxml.IMXMLPropertySpecifierNode)1 IMXMLSingleDataBindingNode (org.apache.flex.compiler.tree.mxml.IMXMLSingleDataBindingNode)1