protected override QilNode VisitLoop(QilLoop local0) {
QilNode local1 = local0[0];
QilNode local2 = local0[1];
if (this[XmlILOptimization.FoldNone]) {
if ( (object) ( (local1).XmlType ) == (object) XmlQueryTypeFactory.None ) {
if (AllowReplace(XmlILOptimization.FoldNone, local0)) {
return Replace(XmlILOptimization.FoldNone, local0, VisitNop(f.Nop( (QilNode) (local1)[0] )));
}
}
}
if (this[XmlILOptimization.EliminateIterator]) {
if (local1.NodeType == QilNodeType.For) {
QilNode local3 = local1[0];
if (local3.NodeType == QilNodeType.For) {
if ( !OptimizerPatterns.Read(local1).MatchesPattern(OptimizerPatternName.IsPositional) ) {
if (AllowReplace(XmlILOptimization.EliminateIterator, local0)) {
return Replace(XmlILOptimization.EliminateIterator, local0, Subs(local2, local1, local3) );
}
}
}
}
}
if (this[XmlILOptimization.EliminateLoop]) {
if (local1.NodeType == QilNodeType.For) {
QilNode local3 = local1[0];
if (local3.NodeType == QilNodeType.Sequence) {
if ( (local3).Count == (0) ) {
if (AllowReplace(XmlILOptimization.EliminateLoop, local0)) {
return Replace(XmlILOptimization.EliminateLoop, local0, VisitSequence(f.Sequence()));
}
}
}
}
}
if (this[XmlILOptimization.EliminateLoop]) {
if ( !OptimizerPatterns.Read(local1).MatchesPattern(OptimizerPatternName.MaybeSideEffects) ) {
if (local2.NodeType == QilNodeType.Sequence) {
if ( (local2).Count == (0) ) {
if (AllowReplace(XmlILOptimization.EliminateLoop, local0)) {
return Replace(XmlILOptimization.EliminateLoop, local0, VisitSequence(f.Sequence()));
}
}
}
}
}
if (this[XmlILOptimization.EliminateLoop]) {
if (local2 == local1) {
if (AllowReplace(XmlILOptimization.EliminateLoop, local0)) {
return Replace(XmlILOptimization.EliminateLoop, local0, (QilNode) (local1)[0] );
}
}
}
if (this[XmlILOptimization.NormalizeLoopText]) {
if (local1.NodeType == QilNodeType.For) {
QilNode local3 = local1[0];
if ( ( (local3).XmlType ).IsSingleton ) {
if (local2.NodeType == QilNodeType.TextCtor) {
QilNode local4 = local2[0];
if (AllowReplace(XmlILOptimization.NormalizeLoopText, local0)) {
return Replace(XmlILOptimization.NormalizeLoopText, local0, VisitTextCtor(f.TextCtor(VisitLoop(f.Loop(local1, local4)))));
}
}
}
}
}
if (this[XmlILOptimization.EliminateIteratorUsedAtMostOnce]) {
if ((( (local1).NodeType == QilNodeType.Let ) || ( ( ( (QilNode) (local1)[0] ).XmlType ).IsSingleton )) && ( !OptimizerPatterns.Read(local1).MatchesPattern(OptimizerPatternName.MaybeSideEffects) )) {
if (( nodeCounter.Count(local2, local1) <= 1 ) && ( !OptimizerPatterns.Read(local2).MatchesPattern(OptimizerPatternName.MaybeSideEffects) )) {
if (AllowReplace(XmlILOptimization.EliminateIteratorUsedAtMostOnce, local0)) {
return Replace(XmlILOptimization.EliminateIteratorUsedAtMostOnce, local0, Subs(local2, local1, (QilNode) (local1)[0] ) );
}
}
}
}
if (this[XmlILOptimization.NormalizeLoopConditional]) {
if (local2.NodeType == QilNodeType.Conditional) {
QilNode local3 = local2[0];
QilNode local4 = local2[1];
QilNode local5 = local2[2];
if (local4.NodeType == QilNodeType.Sequence) {
if ( (local4).Count == (0) ) {
if (local5 == local1) {
if (AllowReplace(XmlILOptimization.NormalizeLoopConditional, local0)) {
return Replace(XmlILOptimization.NormalizeLoopConditional, local0, VisitFilter(f.Filter(local1, VisitNot(f.Not(local3)))));
}
}
}
}
}
}
if (this[XmlILOptimization.NormalizeLoopConditional]) {
if (local2.NodeType == QilNodeType.Conditional) {
QilNode local3 = local2[0];
QilNode local4 = local2[1];
QilNode local5 = local2[2];
if (local4 == local1) {
if (local5.NodeType == QilNodeType.Sequence) {
if ( (local5).Count == (0) ) {
if (AllowReplace(XmlILOptimization.NormalizeLoopConditional, local0)) {
return Replace(XmlILOptimization.NormalizeLoopConditional, local0, VisitFilter(f.Filter(local1, local3)));
}
}
}
}
}
}
if (this[XmlILOptimization.NormalizeLoopConditional]) {
if (local1.NodeType == QilNodeType.For) {
if (local2.NodeType == QilNodeType.Conditional) {
QilNode local4 = local2[0];
QilNode local5 = local2[1];
QilNode local6 = local2[2];
if (local5.NodeType == QilNodeType.Sequence) {
if ( (local5).Count == (0) ) {
if ( NonPositional(local6, local1) ) {
if (AllowReplace(XmlILOptimization.NormalizeLoopConditional, local0)) {
QilNode local7 = VisitFor(f.For(VisitFilter(f.Filter(local1, VisitNot(f.Not(local4))))));
return Replace(XmlILOptimization.NormalizeLoopConditional, local0, VisitLoop(f.Loop(local7, Subs(local6, local1, local7) )));
}
}
}
}
}
}
}
if (this[XmlILOptimization.NormalizeLoopConditional]) {
if (local1.NodeType == QilNodeType.For) {
if (local2.NodeType == QilNodeType.Conditional) {
QilNode local4 = local2[0];
QilNode local5 = local2[1];
QilNode local6 = local2[2];
if ( NonPositional(local5, local1) ) {
if (local6.NodeType == QilNodeType.Sequence) {
if ( (local6).Count == (0) ) {
if (AllowReplace(XmlILOptimization.NormalizeLoopConditional, local0)) {
QilNode local7 = VisitFor(f.For(VisitFilter(f.Filter(local1, local4))));
return Replace(XmlILOptimization.NormalizeLoopConditional, local0, VisitLoop(f.Loop(local7, Subs(local5, local1, local7) )));
}
}
}
}
}
}
}
if (this[XmlILOptimization.NormalizeLoopLoop]) {
if (local2.NodeType == QilNodeType.Loop) {
QilNode local3 = local2[0];
QilNode local5 = local2[1];
if (local3.NodeType == QilNodeType.For) {
QilNode local4 = local3[0];
if ((!(DependsOn(local5,local1))) && ( NonPositional(local5, local3) )) {
if (AllowReplace(XmlILOptimization.NormalizeLoopLoop, local0)) {
QilNode local6 = VisitFor(f.For(VisitLoop(f.Loop(local1, local4))));
return Replace(XmlILOptimization.NormalizeLoopLoop, local0, VisitLoop(f.Loop(local6, Subs(local5, local3, local6) )));
}
}
}
}
}
if (this[XmlILOptimization.AnnotateSingletonLoop]) {
if (local1.NodeType == QilNodeType.For) {
QilNode local3 = local1[0];
if ( !( (local3).XmlType ).MaybeMany ) {
if (AllowReplace(XmlILOptimization.AnnotateSingletonLoop, local0)) {
OptimizerPatterns.Inherit((QilNode) (local2), (QilNode) (local0), OptimizerPatternName.IsDocOrderDistinct); OptimizerPatterns.Inherit((QilNode) (local2), (QilNode) (local0), OptimizerPatternName.SameDepth); }
}
}
}
if (this[XmlILOptimization.AnnotateRootLoop]) {
if ( IsStepPattern(local2, QilNodeType.Root) ) {
if (AllowReplace(XmlILOptimization.AnnotateRootLoop, local0)) {
OptimizerPatterns.Write((QilNode) (local0)).AddPattern(OptimizerPatternName.SameDepth); }
}
}
if (this[XmlILOptimization.AnnotateContentLoop]) {
if (local1.NodeType == QilNodeType.For) {
QilNode local3 = local1[0];
if ( OptimizerPatterns.Read((QilNode) (local3)).MatchesPattern(OptimizerPatternName.SameDepth) ) {
if ((( IsStepPattern(local2, QilNodeType.Content) ) || ( IsStepPattern(local2, QilNodeType.Union) )) && ( (local1) == ( OptimizerPatterns.Read((QilNode) (local2)).GetArgument(OptimizerPatternArgument.StepInput) ) )) {
if (AllowReplace(XmlILOptimization.AnnotateContentLoop, local0)) {
OptimizerPatterns.Write((QilNode) (local0)).AddPattern(OptimizerPatternName.SameDepth); OptimizerPatterns.Inherit((QilNode) (local3), (QilNode) (local0), OptimizerPatternName.IsDocOrderDistinct); }
}
}
}
}
if (this[XmlILOptimization.AnnotateAttrNmspLoop]) {
if (local1.NodeType == QilNodeType.For) {
QilNode local3 = local1[0];
if (((( IsStepPattern(local2, QilNodeType.Attribute) ) || ( IsStepPattern(local2, QilNodeType.XPathNamespace) )) || ( OptimizerPatterns.Read((QilNode) (local2)).MatchesPattern(OptimizerPatternName.FilterAttributeKind) )) && ( (local1) == ( OptimizerPatterns.Read((QilNode) (local2)).GetArgument(OptimizerPatternArgument.StepInput) ) )) {
if (AllowReplace(XmlILOptimization.AnnotateAttrNmspLoop, local0)) {
OptimizerPatterns.Inherit((QilNode) (local3), (QilNode) (local0), OptimizerPatternName.SameDepth); OptimizerPatterns.Inherit((QilNode) (local3), (QilNode) (local0), OptimizerPatternName.IsDocOrderDistinct); }
}
}
}
if (this[XmlILOptimization.AnnotateDescendantLoop]) {
if (local1.NodeType == QilNodeType.For) {
QilNode local3 = local1[0];
if ( OptimizerPatterns.Read((QilNode) (local3)).MatchesPattern(OptimizerPatternName.SameDepth) ) {
if ((( IsStepPattern(local2, QilNodeType.Descendant) ) || ( IsStepPattern(local2, QilNodeType.DescendantOrSelf) )) && ( (local1) == ( OptimizerPatterns.Read((QilNode) (local2)).GetArgument(OptimizerPatternArgument.StepInput) ) )) {
if (AllowReplace(XmlILOptimization.AnnotateDescendantLoop, local0)) {
OptimizerPatterns.Inherit((QilNode) (local3), (QilNode) (local0), OptimizerPatternName.IsDocOrderDistinct); }
}
}
}
}
return NoReplace(local0);
}