/// <summary> /// Add an assignment to default value for the given parameter/variable /// </summary> /// <param name="methodDeclarationSyntax">method/accessor where to inject the assignment</param> /// <param name="outParameterParameterName">parameter/variable name</param> /// <param name="outParameterParameterType">parameter/variable type</param> /// <returns>the method with a block containing an initialization to default for the given variables/parameters</returns> public BaseMethodDeclarationSyntax AddDefaultInitializer(BaseMethodDeclarationSyntax methodDeclarationSyntax, SyntaxToken outParameterParameterName, TypeSyntax outParameterParameterType) { if (methodDeclarationSyntax.Body == null) { throw new InvalidOperationException( "Cant' add default initializer(s) to expression bodied or virtual method."); } IEnumerable <StatementSyntax> initializers; IEnumerable <StatementSyntax> originalStatements; if (methodDeclarationSyntax.Body.Statements.Count > 0 && methodDeclarationSyntax.Body.Statements[0].HasAnnotation(blockMarker)) { // we add a new initializer, we need to get the existing ones initializers = (methodDeclarationSyntax.Body.Statements[0] as BlockSyntax).Statements; // we can skip the initializer helper block originalStatements = methodDeclarationSyntax.Body.Statements.Skip(1); } else { // this is the first initializer helper, no pre existing ones initializers = Array.Empty <StatementSyntax>(); // keep all statements originalStatements = methodDeclarationSyntax.Body.Statements; } var initializer = SyntaxFactory.ExpressionStatement(SyntaxFactory.AssignmentExpression( SyntaxKind.SimpleAssignmentExpression, SyntaxFactory.IdentifierName(outParameterParameterName), outParameterParameterType.BuildDefaultExpression())); var initializersBlock = SyntaxFactory.Block(initializers.Append(initializer)) .WithAdditionalAnnotations(blockMarker); return(methodDeclarationSyntax.WithBody(methodDeclarationSyntax.Body.WithStatements(new SyntaxList <StatementSyntax>(originalStatements.Prepend(initializersBlock)))).WithAdditionalAnnotations(Marker)); }