/// <summary> /// The containers of the current transform context. /// </summary> /// <param name="context"></param> /// <param name="loopVarsHaveOneContainer"></param> internal Containers(BasicTransformContext context, bool loopVarsHaveOneContainer = true) // : this(FindContainers(context)) { if (loopVarsHaveOneContainer) { int ancIndex2 = Recognizer.GetAncestorIndexOfLoopBeingInitialized(context); if (ancIndex2 != -1) { // For a loop variable, the loop is the only container. // This is needed to allow re-ordering nested loops. Otherwise, the inner loop variable would always require the outer loop around it. // It is also useful for ignoring conditioned loops. TransformInfo ti = context.InputStack[ancIndex2]; IForStatement ifs = (IForStatement)ti.inputElement; IStatement container = CreateContainer(ifs); inputs.Add(container); #if ignoreOutput outputs.Add(container); #else outputs.Add((IStatement)ti.PrimaryOutput); #endif var loopVar = Recognizer.LoopVariable(ifs); bool mustRemove = false; if (!context.InputAttributes.Has <Containers>(loopVar)) { context.InputAttributes.Set(loopVar, this); mustRemove = true; } var initExpr = ((IExpressionStatement)ifs.Initializer).Expression; this.AddContainersNeededForExpression(context, initExpr); this.AddContainersNeededForExpression(context, ifs.Condition); if (mustRemove) { context.InputAttributes.Remove <Containers>(loopVar); } return; } } // exclude the current statement. int ancIndex = context.FindAncestorIndex <IStatement>(); for (int i = 0; i < ancIndex; i++) { TransformInfo ti = context.InputStack[i]; IStatement inputElement = ti.inputElement as IStatement; if (IsContainer(inputElement) && !context.InputAttributes.Has <ConvergenceLoop>(inputElement)) { inputs.Add(CreateContainer(inputElement)); outputs.Add((IStatement)ti.PrimaryOutput); } } }