private MethodDeclarationSyntax actionDeclaration(AppApiGroupTemplate group, AppApiActionTemplate action)
 {
     if (action.IsRedirect())
     {
         return(actionDeclarationForRedirect(group, action));
     }
     if (action.IsView() || action.IsPartialView())
     {
         return(actionDeclarationForView(group, action));
     }
     return(actionDeclarationForPost(group, action));
 }
    private MethodDeclarationSyntax actionDeclarationForView(AppApiGroupTemplate group, AppApiActionTemplate action)
    {
        var actionDeclaration = MethodDeclaration
                                (
            GenericName(Identifier("Task"))
            .WithTypeArgumentList
            (
                TypeArgumentList
                (
                    SingletonSeparatedList <TypeSyntax>
                    (
                        IdentifierName("IActionResult")
                    )
                )
            ),
            Identifier(action.Name)
                                )
                                .WithModifiers
                                (
            TokenList
            (
                new[]
        {
            Token(SyntaxKind.PublicKeyword),
            Token(SyntaxKind.AsyncKeyword)
        }
            )
                                )
                                .WithBody
                                (
            Block
            (
                LocalDeclarationStatement
                (
                    VariableDeclaration(IdentifierName("var"))
                    .WithVariables
                    (
                        SingletonSeparatedList
                        (
                            VariableDeclarator(Identifier("result"))
                            .WithInitializer
                            (
                                EqualsValueClause
                                (
                                    AwaitExpression
                                    (
                                        executeInvocationExpression(group, action)
                                    )
                                )
                            )
                        )
                    )
                ),
                ReturnStatement
                (
                    InvocationExpression(IdentifierName(action.IsView() ? "View" : "PartialView"))
                    .WithArgumentList
                    (
                        ArgumentList
                        (
                            SingletonSeparatedList
                            (
                                Argument
                                (
                                    MemberAccessExpression
                                    (
                                        SyntaxKind.SimpleMemberAccessExpression,
                                        MemberAccessExpression
                                        (
                                            SyntaxKind.SimpleMemberAccessExpression,
                                            IdentifierName("result"),
                                            IdentifierName("Data")
                                        ),
                                        IdentifierName("ViewName")
                                    )
                                )
                            )
                        )
                    )
                )
            )
                                );

        if (!action.HasEmptyModel())
        {
            actionDeclaration = actionDeclaration
                                .WithParameterList
                                (
                ParameterList
                (
                    SingletonSeparatedList
                    (
                        Parameter(Identifier("model"))
                        .WithType(typeSyntax(action.ModelTemplate))
                    )
                )
                                );
        }
        if (action.IsPartialView())
        {
            actionDeclaration = actionDeclaration
                                .WithAttributeLists
                                (
                SingletonList
                (
                    AttributeList
                    (
                        SingletonSeparatedList
                        (
                            Attribute(IdentifierName("ResponseCache"))
                            .WithArgumentList
                            (
                                AttributeArgumentList
                                (
                                    SingletonSeparatedList
                                    (
                                        AttributeArgument
                                        (
                                            LiteralExpression
                                            (
                                                SyntaxKind.StringLiteralExpression,
                                                Literal("Default")
                                            )
                                        )
                                        .WithNameEquals
                                        (
                                            NameEquals(IdentifierName("CacheProfileName"))
                                        )
                                    )
                                )
                            )
                        )
                    )
                )
                                );
        }
        return(actionDeclaration);
    }