System.Xml.Xsl.IlGen.XmlILOptimizerVisitor.VisitFunction C# (CSharp) Method

VisitFunction() protected method

protected VisitFunction ( QilFunction local0 ) : QilNode
local0 System.Xml.Xsl.Qil.QilFunction
return QilNode
        protected override QilNode VisitFunction(QilFunction local0) {
            QilNode local1 = local0[0];
            QilNode local2 = local0[1];
            QilNode local3 = local0[2];
            XmlQueryType local4 = (XmlQueryType)((QilFunction)local0).XmlType;
            if ((  (local0).XmlType .IsSubtypeOf( XmlQueryTypeFactory.NodeS ) ) && (this[XmlILOptimization.AnnotateIndex1])) {
                if ((( local1.Count == 2 ) && (  ( (QilNode) (local1)[0] ).XmlType .IsSubtypeOf( XmlQueryTypeFactory.Node ) )) && ( ( ( (QilNode) (local1)[1] ).XmlType ) == ( XmlQueryTypeFactory.StringX ) )) {
                    if (local2.NodeType == QilNodeType.Filter) {
                        QilNode local5 = local2[0];
                        QilNode local7 = local2[1];
                        if (local5.NodeType == QilNodeType.For) {
                            QilNode local6 = local5[0];
                            if (local7.NodeType == QilNodeType.Not) {
                                QilNode local8 = local7[0];
                                if (local8.NodeType == QilNodeType.IsEmpty) {
                                    QilNode local9 = local8[0];
                                    if (local9.NodeType == QilNodeType.Filter) {
                                        QilNode local10 = local9[0];
                                        QilNode local12 = local9[1];
                                        if (local10.NodeType == QilNodeType.For) {
                                            QilNode local11 = local10[0];
                                            if (local12.NodeType == QilNodeType.Eq) {
                                                QilNode local13 = local12[0];
                                                QilNode local14 = local12[1];
                                                if (local13 == local10) {
                                                    if (local14.NodeType == QilNodeType.Parameter) {
                                                        if ( (local14) == ( (QilNode) (local1)[1] ) ) {
                                                            if (AllowReplace(XmlILOptimization.AnnotateIndex1, local0)) {
                                                                
    // The following conditions must be true for this pattern to match:
    //   1. The function must have exactly two arguments
    //   2. The type of the first argument must be a subtype of Node
    //   3. The type of the second argument must be String
    //   4. The return type must be a subtype of Node*
    //   5. Every reference to $args[0] (context document) must be wrapped in an (Root *) function
    //   6. $keyParam cannot be used with the $bindingNodes and $bindingKeys expressions

    EqualityIndexVisitor visitor = new EqualityIndexVisitor();
    if (visitor.Scan(local6, local1[0], local14) && visitor.Scan(local11, local1[0], local14)) {
        // All conditions were true, so annotate Filter with the EqualityIndex pattern
        OptimizerPatterns patt = OptimizerPatterns.Write(local2);
        patt.AddPattern(OptimizerPatternName.EqualityIndex);
        patt.AddArgument(OptimizerPatternArgument.IndexedNodes, local5);
        patt.AddArgument(OptimizerPatternArgument.KeyExpression, local11);
    }
}
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if (this[XmlILOptimization.AnnotateIndex2]) {
                if ((( local1.Count == 2 ) && ( ( ( (QilNode) (local1)[0] ).XmlType ) == ( XmlQueryTypeFactory.Node ) )) && ( ( ( (QilNode) (local1)[1] ).XmlType ) == ( XmlQueryTypeFactory.StringX ) )) {
                    if (local2.NodeType == QilNodeType.Filter) {
                        QilNode local5 = local2[0];
                        QilNode local7 = local2[1];
                        if (local5.NodeType == QilNodeType.For) {
                            QilNode local6 = local5[0];
                            if (local7.NodeType == QilNodeType.Eq) {
                                QilNode local8 = local7[0];
                                QilNode local9 = local7[1];
                                if (local9.NodeType == QilNodeType.Parameter) {
                                    if ( (local9) == ( (QilNode) (local1)[1] ) ) {
                                        if (AllowReplace(XmlILOptimization.AnnotateIndex2, local0)) {
                                            
    // Same as EqualityIndex1, except that each nodes has at most one key value

    EqualityIndexVisitor visitor = new EqualityIndexVisitor();
    if (visitor.Scan(local6, local1[0], local9) && visitor.Scan(local8, local1[0], local9)) {
        // All conditions were true, so annotate Filter with the EqualityIndex pattern
        OptimizerPatterns patt = OptimizerPatterns.Write(local2);
        patt.AddPattern(OptimizerPatternName.EqualityIndex);
        patt.AddArgument(OptimizerPatternArgument.IndexedNodes, local5);
        patt.AddArgument(OptimizerPatternArgument.KeyExpression, local8);
    }
}
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return NoReplace(local0);
        }
        
XmlILOptimizerVisitor