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); }