Esempio n. 1
0
        private static MethodDeclarationSyntax concurrentMethod(Class ctx, MethodDeclarationSyntax method, bool forever = false)
        {
            var name = method.Identifier.ToString();

            var body             = method.Body;
            var returnStatements = body
                                   .DescendantNodes()
                                   .OfType <ReturnStatementSyntax>();

            var lastReturn = body.Statements.LastOrDefault() as ReturnStatementSyntax;

            if (returnStatements.Any())
            {
                body = body
                       .ReplaceNodes(returnStatements,
                                     (on, nn) => Templates
                                     .ExpressionReturn
                                     .Get <StatementSyntax>(nn.Expression == null || nn.Expression.IsMissing
                            ? Roslyn.@null
                            : nn.Expression,
                                                            Roslyn.Quoted(method.Identifier.ToString())));
            }

            if (forever)
            {
                body = CSharp.Block(
                    CSharp.ForStatement(body));
            }
            else if (lastReturn == null)
            {
                body = body.AddStatements(Templates
                                          .ExpressionReturn
                                          .Get <StatementSyntax>(
                                              Roslyn.@null,
                                              Roslyn.Quoted(method.Identifier.ToString())));
            }

            var result = Templates
                         .ConcurrentMethod
                         .Get <MethodDeclarationSyntax>("__concurrent" + name);

            result = result
                     .WithParameterList(method
                                        .ParameterList
                                        .AddParameters(result
                                                       .ParameterList
                                                       .Parameters
                                                       .ToArray()))
                     .WithBody(body);

            ctx.AddMember(result);
            return(result);
        }