コード例 #1
0
        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));
        }