diff --git a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpCodeGenerationService.cs b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpCodeGenerationService.cs index a8b06ba013772945206de74f2613deefa0df42bf..0b01e3e7e642f5157a646f863a62bb3af5429654 100644 --- a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpCodeGenerationService.cs +++ b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpCodeGenerationService.cs @@ -466,13 +466,9 @@ protected override TDeclarationNode AddMembers(TDeclarationNod CodeGenerationOptions options, CancellationToken cancellationToken) { - if (destinationMember is MemberDeclarationSyntax memberDeclaration) - { - return AddStatementsToMemberDeclaration(destinationMember, statements, memberDeclaration); - } - else if (destinationMember is LocalFunctionStatementSyntax localFunctionDeclaration) + if (destinationMember is MemberDeclarationSyntax || destinationMember is LocalFunctionStatementSyntax) { - return AddStatementsToLocalFunction(destinationMember, statements, localFunctionDeclaration); + return AddStatementsToMemberOrLocalFunctionDeclaration(destinationMember, statements); } else { @@ -520,34 +516,44 @@ protected override TDeclarationNode AddMembers(TDeclarationNod throw new ArgumentException(CSharpWorkspaceResources.No_available_location_found_to_add_statements_to); } - private static TDeclarationNode AddStatementsToMemberDeclaration(TDeclarationNode destinationMember, IEnumerable statements, MemberDeclarationSyntax memberDeclaration) where TDeclarationNode : SyntaxNode + private static TDeclarationNode AddStatementsToMemberOrLocalFunctionDeclaration(TDeclarationNode destinationMember, IEnumerable statements) where TDeclarationNode : SyntaxNode { - var body = memberDeclaration.GetBody(); - if (body == null) + if (destinationMember is MemberDeclarationSyntax memberDeclaration) { - return destinationMember; - } - - var statementNodes = body.Statements.ToList(); - statementNodes.AddRange(StatementGenerator.GenerateStatements(statements)); + var finalBody = GetFinalBody(memberDeclaration.GetBody(), statements); + if (finalBody == null) + { + return destinationMember; + } - var finalBody = body.WithStatements(SyntaxFactory.List(statementNodes)); - var finalMember = memberDeclaration.WithBody(finalBody); + var finalMember = memberDeclaration.WithBody(finalBody); + return Cast(finalMember); + } + else + { + var localFunctionDeclaration = Cast(destinationMember); + var finalBody = GetFinalBody(localFunctionDeclaration.Body, statements); + if (finalBody == null) + { + return destinationMember; + } - return Cast(finalMember); + var finalMember = localFunctionDeclaration.WithBody(finalBody); + return Cast(finalMember); + } } - private static TDeclarationNode AddStatementsToLocalFunction(TDeclarationNode destinationMember, IEnumerable statements, LocalFunctionStatementSyntax localFunctionDeclaration) where TDeclarationNode : SyntaxNode + private static BlockSyntax GetFinalBody(BlockSyntax body, IEnumerable statements) { - var body = localFunctionDeclaration.Body; + if (body == null) + { + return null; + } var statementNodes = body.Statements.ToList(); statementNodes.AddRange(StatementGenerator.GenerateStatements(statements)); - var finalBody = body.WithStatements(SyntaxFactory.List(statementNodes)); - var finalMember = localFunctionDeclaration.WithBody(finalBody); - - return Cast(finalMember); + return body.WithStatements(SyntaxFactory.List(statementNodes)); } public override SyntaxNode CreateEventDeclaration(