public static IEnumerable <SyntaxNode> BuildForEach(this RoslynTranslator translator, ForEachHeaderModel forEachHeaderModelStatement, IPortModel portModel) { IPortModel loopExecutionInputPortModel = forEachHeaderModelStatement.InputPort; IPortModel insertLoopPortModel = loopExecutionInputPortModel?.ConnectionPortModels?.FirstOrDefault(); var insertLoopNodeModel = insertLoopPortModel?.NodeModel as IHasMainInputPort; IPortModel collectionInputPortModel = insertLoopNodeModel?.InputPort; if (collectionInputPortModel == null || !collectionInputPortModel.Connected || !collectionInputPortModel.DataType.IsVsArrayType(translator.Stencil)) { yield break; } var collectionName = translator.MakeUniqueName("Collection"); SyntaxNode collectionSyntax = translator.BuildPort(collectionInputPortModel).SingleOrDefault(); yield return(RoslynBuilder.DeclareLoopCollectionVariable(collectionSyntax, collectionName)); if (forEachHeaderModelStatement.IndexVariableDeclarationModel != null) { yield return(forEachHeaderModelStatement.IndexVariableDeclarationModel.DeclareLoopIndexVariable(-1)); } if (forEachHeaderModelStatement.CountVariableDeclarationModel != null) { var collectionInput = translator.BuildPort(collectionInputPortModel).SingleOrDefault() as ExpressionSyntax; yield return(forEachHeaderModelStatement.CountVariableDeclarationModel.DeclareLoopCountVariable( collectionInput, collectionName, translator)); } var forEachBlock = SyntaxFactory.Block(); foreach (var localDeclaration in BuildLocalDeclarations(translator, forEachHeaderModelStatement)) { forEachBlock = forEachBlock.AddStatements(localDeclaration); } if (forEachHeaderModelStatement.IndexVariableDeclarationModel != null) { forEachBlock = forEachBlock.AddStatements(SyntaxFactory.ExpressionStatement( SyntaxFactory.PostfixUnaryExpression( SyntaxKind.PostIncrementExpression, SyntaxFactory.IdentifierName(forEachHeaderModelStatement.IndexVariableDeclarationModel.name))) ); } translator.BuildStack(forEachHeaderModelStatement, ref forEachBlock, StackExitStrategy.Continue); var itemModel = forEachHeaderModelStatement.ItemVariableDeclarationModel; if (itemModel == null) { yield break; } yield return(SyntaxFactory.ForEachStatement( SyntaxFactory.IdentifierName("var"), SyntaxFactory.Identifier(itemModel.VariableName), SyntaxFactory.IdentifierName(collectionName), forEachBlock)); }