From 277225da2f888b1c3b826cf7a877afae43fb9510 Mon Sep 17 00:00:00 2001 From: "Juan C. Diaz" Date: Sat, 23 Mar 2024 12:22:36 -0400 Subject: [PATCH 1/6] Fix #72632 --- .../MoveType/MoveTypeTests.MoveToNewFile.cs | 28 +++++++++++++++++++ .../AbstractMoveTypeService.MoveTypeEditor.cs | 12 ++++++-- .../CodeGeneration/CSharpSyntaxGenerator.cs | 11 ++++++++ .../Editing/SyntaxEditorExtensions.cs | 3 ++ .../Core/Portable/Editing/SyntaxGenerator.cs | 5 ++++ .../VisualBasicSyntaxGenerator.vb | 4 +++ 6 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/EditorFeatures/CSharpTest/CodeActions/MoveType/MoveTypeTests.MoveToNewFile.cs b/src/EditorFeatures/CSharpTest/CodeActions/MoveType/MoveTypeTests.MoveToNewFile.cs index a5ed7ad17fe5b..1aaed2ccaa5a0 100644 --- a/src/EditorFeatures/CSharpTest/CodeActions/MoveType/MoveTypeTests.MoveToNewFile.cs +++ b/src/EditorFeatures/CSharpTest/CodeActions/MoveType/MoveTypeTests.MoveToNewFile.cs @@ -535,6 +535,34 @@ class Class2 { } await TestMoveTypeToNewFileAsync(code, codeAfterMove, expectedDocumentName, destinationDocumentText, index: 1); } + [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/72632")] + public async Task MoveNestedTypeToNewFile_Simple_DottedName_WithPrimaryCtor() + { + var code = +@"internal class Outer() +{ + private class Inner[||] + { + } +}"; + + var codeAfterMove = +@"internal partial class Outer() +{ +}"; + + var expectedDocumentName = "Outer.Inner.cs"; + + var destinationDocumentText = +@"internal partial class Outer +{ + private class Inner + { + } +}"; + await TestMoveTypeToNewFileAsync(code, codeAfterMove, expectedDocumentName, destinationDocumentText, index: 1); + } + [WpfFact] public async Task MoveNestedTypeToNewFile_ParentHasOtherMembers() { diff --git a/src/Features/Core/Portable/CodeRefactorings/MoveType/AbstractMoveTypeService.MoveTypeEditor.cs b/src/Features/Core/Portable/CodeRefactorings/MoveType/AbstractMoveTypeService.MoveTypeEditor.cs index 1cf7f7b7d46e5..ff0f9a84b22af 100644 --- a/src/Features/Core/Portable/CodeRefactorings/MoveType/AbstractMoveTypeService.MoveTypeEditor.cs +++ b/src/Features/Core/Portable/CodeRefactorings/MoveType/AbstractMoveTypeService.MoveTypeEditor.cs @@ -125,7 +125,7 @@ private async Task AddNewDocumentWithSingleTypeDeclarationAsync(Docume // attributes from the containing partial types. We don't want to create // duplicate attributes on things. AddPartialModifiersToTypeChain( - documentEditor, removeAttributesAndComments: true, removeTypeInheritance: true); + documentEditor, removeAttributesAndComments: true, removeTypeInheritance: true, removePrimaryCtor: true); // remove things that are not being moved, from the forked document. var membersToRemove = GetMembersToRemove(root); @@ -193,7 +193,7 @@ private async Task RemoveTypeFromSourceDocumentAsync(Document sourceDo // However, keep all the attributes on these types as theses are the // original attributes and we don't want to mess with them. AddPartialModifiersToTypeChain(documentEditor, - removeAttributesAndComments: false, removeTypeInheritance: false); + removeAttributesAndComments: false, removeTypeInheritance: false, removePrimaryCtor: false); documentEditor.RemoveNode(State.TypeNode, SyntaxRemoveOptions.KeepUnbalancedDirectives); var updatedDocument = documentEditor.GetChangedDocument(); @@ -258,7 +258,8 @@ TMemberDeclarationSyntax or private void AddPartialModifiersToTypeChain( DocumentEditor documentEditor, bool removeAttributesAndComments, - bool removeTypeInheritance) + bool removeTypeInheritance, + bool removePrimaryCtor) { var semanticFacts = State.SemanticDocument.Document.GetRequiredLanguageService(); var typeChain = State.TypeNode.Ancestors().OfType(); @@ -283,6 +284,11 @@ private void AddPartialModifiersToTypeChain( { documentEditor.RemoveAllTypeInheritance(node); } + + if (removePrimaryCtor) + { + documentEditor.RemovePrimaryCtor(node); + } } documentEditor.ReplaceNode(State.TypeNode, diff --git a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs index 4b687b6a306e8..9643ff5f42d82 100644 --- a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs +++ b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs @@ -1200,6 +1200,17 @@ private static SyntaxNode WithAttributeLists(SyntaxNode declaration, SyntaxList< _ => declaration, }; + internal override ImmutableArray GetPrimaryCtor(SyntaxNode declaration) + { + if (declaration is ClassDeclarationSyntax || declaration is StructDeclarationSyntax) + { + var paramList = declaration.GetParameterList(); + if (paramList is not null) + return [paramList]; + } + return []; + } + internal override ImmutableArray GetTypeInheritance(SyntaxNode declaration) => declaration is BaseTypeDeclarationSyntax baseType && baseType.BaseList != null ? [baseType.BaseList] diff --git a/src/Workspaces/Core/Portable/Editing/SyntaxEditorExtensions.cs b/src/Workspaces/Core/Portable/Editing/SyntaxEditorExtensions.cs index 51c79506734fd..e7928cda864ac 100644 --- a/src/Workspaces/Core/Portable/Editing/SyntaxEditorExtensions.cs +++ b/src/Workspaces/Core/Portable/Editing/SyntaxEditorExtensions.cs @@ -75,4 +75,7 @@ public static void AddInterfaceType(this SyntaxEditor editor, SyntaxNode declara public static void AddBaseType(this SyntaxEditor editor, SyntaxNode declaration, SyntaxNode baseType) => editor.ReplaceNode(declaration, (d, g) => g.AddBaseType(d, baseType)); + + internal static void RemovePrimaryCtor(this SyntaxEditor editor, SyntaxNode declaration) + => editor.ReplaceNode(declaration, (d, g) => g.RemovePrimaryCtor(d)); } diff --git a/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs b/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs index e26b4065bb6cf..53ede1c0038f5 100644 --- a/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs +++ b/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs @@ -1071,6 +1071,11 @@ public SyntaxNode RemoveAllAttributes(SyntaxNode declaration) /// internal abstract SyntaxNode RemoveAllComments(SyntaxNode node); + internal SyntaxNode RemovePrimaryCtor(SyntaxNode declaration) + => RemoveNodes(declaration, GetPrimaryCtor(declaration)); + + internal abstract ImmutableArray GetPrimaryCtor(SyntaxNode declaration); + internal SyntaxNode RemoveLeadingAndTrailingComments(SyntaxNode node) { return node.WithLeadingTrivia(RemoveCommentLines(node.GetLeadingTrivia())) diff --git a/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb b/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb index b5eabd5569fa1..5b874da6cc10a 100644 --- a/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb +++ b/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb @@ -1675,6 +1675,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration Return attr.WithTarget(Nothing) End Function + Friend Overrides Function GetPrimaryCtor(declaration As SyntaxNode) As ImmutableArray(Of SyntaxNode) + Return ImmutableArray(Of SyntaxNode).Empty + End Function + Friend Overrides Function GetTypeInheritance(declaration As SyntaxNode) As ImmutableArray(Of SyntaxNode) Dim typeDecl = TryCast(declaration, TypeBlockSyntax) If typeDecl Is Nothing Then From 678dce3819ae9e78c5e8186a7d076140ee080918 Mon Sep 17 00:00:00 2001 From: "Juan C. Diaz" Date: Sat, 23 Mar 2024 16:44:50 -0400 Subject: [PATCH 2/6] Renaming => Ctor to Constructor --- .../MoveType/MoveTypeTests.MoveToNewFile.cs | 2 +- .../MoveType/AbstractMoveTypeService.MoveTypeEditor.cs | 10 +++++----- .../Portable/CodeGeneration/CSharpSyntaxGenerator.cs | 2 +- .../Core/Portable/Editing/SyntaxEditorExtensions.cs | 4 ++-- .../Core/Portable/Editing/SyntaxGenerator.cs | 6 +++--- .../CodeGeneration/VisualBasicSyntaxGenerator.vb | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/EditorFeatures/CSharpTest/CodeActions/MoveType/MoveTypeTests.MoveToNewFile.cs b/src/EditorFeatures/CSharpTest/CodeActions/MoveType/MoveTypeTests.MoveToNewFile.cs index 1aaed2ccaa5a0..5733000af73f9 100644 --- a/src/EditorFeatures/CSharpTest/CodeActions/MoveType/MoveTypeTests.MoveToNewFile.cs +++ b/src/EditorFeatures/CSharpTest/CodeActions/MoveType/MoveTypeTests.MoveToNewFile.cs @@ -536,7 +536,7 @@ class Class2 { } } [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/72632")] - public async Task MoveNestedTypeToNewFile_Simple_DottedName_WithPrimaryCtor() + public async Task MoveNestedTypeToNewFile_Simple_DottedName_WithPrimaryConstructor() { var code = @"internal class Outer() diff --git a/src/Features/Core/Portable/CodeRefactorings/MoveType/AbstractMoveTypeService.MoveTypeEditor.cs b/src/Features/Core/Portable/CodeRefactorings/MoveType/AbstractMoveTypeService.MoveTypeEditor.cs index ff0f9a84b22af..fd88a578f05cf 100644 --- a/src/Features/Core/Portable/CodeRefactorings/MoveType/AbstractMoveTypeService.MoveTypeEditor.cs +++ b/src/Features/Core/Portable/CodeRefactorings/MoveType/AbstractMoveTypeService.MoveTypeEditor.cs @@ -125,7 +125,7 @@ private async Task AddNewDocumentWithSingleTypeDeclarationAsync(Docume // attributes from the containing partial types. We don't want to create // duplicate attributes on things. AddPartialModifiersToTypeChain( - documentEditor, removeAttributesAndComments: true, removeTypeInheritance: true, removePrimaryCtor: true); + documentEditor, removeAttributesAndComments: true, removeTypeInheritance: true, removePrimaryConstructor: true); // remove things that are not being moved, from the forked document. var membersToRemove = GetMembersToRemove(root); @@ -193,7 +193,7 @@ private async Task RemoveTypeFromSourceDocumentAsync(Document sourceDo // However, keep all the attributes on these types as theses are the // original attributes and we don't want to mess with them. AddPartialModifiersToTypeChain(documentEditor, - removeAttributesAndComments: false, removeTypeInheritance: false, removePrimaryCtor: false); + removeAttributesAndComments: false, removeTypeInheritance: false, removePrimaryConstructor: false); documentEditor.RemoveNode(State.TypeNode, SyntaxRemoveOptions.KeepUnbalancedDirectives); var updatedDocument = documentEditor.GetChangedDocument(); @@ -259,7 +259,7 @@ private void AddPartialModifiersToTypeChain( DocumentEditor documentEditor, bool removeAttributesAndComments, bool removeTypeInheritance, - bool removePrimaryCtor) + bool removePrimaryConstructor) { var semanticFacts = State.SemanticDocument.Document.GetRequiredLanguageService(); var typeChain = State.TypeNode.Ancestors().OfType(); @@ -285,9 +285,9 @@ private void AddPartialModifiersToTypeChain( documentEditor.RemoveAllTypeInheritance(node); } - if (removePrimaryCtor) + if (removePrimaryConstructor) { - documentEditor.RemovePrimaryCtor(node); + documentEditor.RemovePrimaryConstructor(node); } } diff --git a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs index 9643ff5f42d82..9308849fa2ffa 100644 --- a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs +++ b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs @@ -1200,7 +1200,7 @@ private static SyntaxNode WithAttributeLists(SyntaxNode declaration, SyntaxList< _ => declaration, }; - internal override ImmutableArray GetPrimaryCtor(SyntaxNode declaration) + internal override ImmutableArray GetPrimaryConstructor(SyntaxNode declaration) { if (declaration is ClassDeclarationSyntax || declaration is StructDeclarationSyntax) { diff --git a/src/Workspaces/Core/Portable/Editing/SyntaxEditorExtensions.cs b/src/Workspaces/Core/Portable/Editing/SyntaxEditorExtensions.cs index e7928cda864ac..c7111748afc1f 100644 --- a/src/Workspaces/Core/Portable/Editing/SyntaxEditorExtensions.cs +++ b/src/Workspaces/Core/Portable/Editing/SyntaxEditorExtensions.cs @@ -76,6 +76,6 @@ public static void AddInterfaceType(this SyntaxEditor editor, SyntaxNode declara public static void AddBaseType(this SyntaxEditor editor, SyntaxNode declaration, SyntaxNode baseType) => editor.ReplaceNode(declaration, (d, g) => g.AddBaseType(d, baseType)); - internal static void RemovePrimaryCtor(this SyntaxEditor editor, SyntaxNode declaration) - => editor.ReplaceNode(declaration, (d, g) => g.RemovePrimaryCtor(d)); + internal static void RemovePrimaryConstructor(this SyntaxEditor editor, SyntaxNode declaration) + => editor.ReplaceNode(declaration, (d, g) => g.RemovePrimaryConstructor(d)); } diff --git a/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs b/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs index 53ede1c0038f5..2501962af63f8 100644 --- a/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs +++ b/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs @@ -1071,10 +1071,10 @@ public SyntaxNode RemoveAllAttributes(SyntaxNode declaration) /// internal abstract SyntaxNode RemoveAllComments(SyntaxNode node); - internal SyntaxNode RemovePrimaryCtor(SyntaxNode declaration) - => RemoveNodes(declaration, GetPrimaryCtor(declaration)); + internal SyntaxNode RemovePrimaryConstructor(SyntaxNode declaration) + => RemoveNodes(declaration, GetPrimaryConstructor(declaration)); - internal abstract ImmutableArray GetPrimaryCtor(SyntaxNode declaration); + internal abstract ImmutableArray GetPrimaryConstructor(SyntaxNode declaration); internal SyntaxNode RemoveLeadingAndTrailingComments(SyntaxNode node) { diff --git a/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb b/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb index 5b874da6cc10a..861df9663198d 100644 --- a/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb +++ b/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb @@ -1675,7 +1675,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration Return attr.WithTarget(Nothing) End Function - Friend Overrides Function GetPrimaryCtor(declaration As SyntaxNode) As ImmutableArray(Of SyntaxNode) + Friend Overrides Function GetPrimaryConstructor(declaration As SyntaxNode) As ImmutableArray(Of SyntaxNode) Return ImmutableArray(Of SyntaxNode).Empty End Function From d6d80b212a86b0660c20497df2e1e9eb9c7cf33a Mon Sep 17 00:00:00 2001 From: "Juan C. Diaz" Date: Sat, 23 Mar 2024 16:52:07 -0400 Subject: [PATCH 3/6] Checking for TypeDeclarationSyntax when getting the primary constructor node --- .../CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs index 9308849fa2ffa..789827d4a1088 100644 --- a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs +++ b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs @@ -1202,7 +1202,7 @@ private static SyntaxNode WithAttributeLists(SyntaxNode declaration, SyntaxList< internal override ImmutableArray GetPrimaryConstructor(SyntaxNode declaration) { - if (declaration is ClassDeclarationSyntax || declaration is StructDeclarationSyntax) + if (declaration is TypeDeclarationSyntax) { var paramList = declaration.GetParameterList(); if (paramList is not null) From df19c44ec0f5b2efb111ed83b6acf7057e975967 Mon Sep 17 00:00:00 2001 From: "Juan C. Diaz" Date: Sat, 23 Mar 2024 16:57:57 -0400 Subject: [PATCH 4/6] Renaming to GetPrimaryConstructorParameterList --- .../CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs | 2 +- src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs | 4 ++-- .../Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs index 789827d4a1088..5ebfbd0ad83dc 100644 --- a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs +++ b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs @@ -1200,7 +1200,7 @@ private static SyntaxNode WithAttributeLists(SyntaxNode declaration, SyntaxList< _ => declaration, }; - internal override ImmutableArray GetPrimaryConstructor(SyntaxNode declaration) + internal override ImmutableArray GetPrimaryConstructorParameterList(SyntaxNode declaration) { if (declaration is TypeDeclarationSyntax) { diff --git a/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs b/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs index 2501962af63f8..23542b315c784 100644 --- a/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs +++ b/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs @@ -1072,9 +1072,9 @@ public SyntaxNode RemoveAllAttributes(SyntaxNode declaration) internal abstract SyntaxNode RemoveAllComments(SyntaxNode node); internal SyntaxNode RemovePrimaryConstructor(SyntaxNode declaration) - => RemoveNodes(declaration, GetPrimaryConstructor(declaration)); + => RemoveNodes(declaration, GetPrimaryConstructorParameterList(declaration)); - internal abstract ImmutableArray GetPrimaryConstructor(SyntaxNode declaration); + internal abstract ImmutableArray GetPrimaryConstructorParameterList(SyntaxNode declaration); internal SyntaxNode RemoveLeadingAndTrailingComments(SyntaxNode node) { diff --git a/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb b/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb index 861df9663198d..b7a0856863bd5 100644 --- a/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb +++ b/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb @@ -1675,7 +1675,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration Return attr.WithTarget(Nothing) End Function - Friend Overrides Function GetPrimaryConstructor(declaration As SyntaxNode) As ImmutableArray(Of SyntaxNode) + Friend Overrides Function GetPrimaryConstructorParameterList(declaration As SyntaxNode) As ImmutableArray(Of SyntaxNode) Return ImmutableArray(Of SyntaxNode).Empty End Function From de9100b6e03f5e5414abb7eacf1cdc6fe54fbe50 Mon Sep 17 00:00:00 2001 From: "Juan C. Diaz" Date: Sat, 23 Mar 2024 18:42:06 -0400 Subject: [PATCH 5/6] Replace return from array for Nullable --- .../Portable/CodeGeneration/CSharpSyntaxGenerator.cs | 6 +++--- src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs | 7 +++++-- .../Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb | 4 ++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs index 5ebfbd0ad83dc..0f269577a2e3b 100644 --- a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs +++ b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs @@ -1200,15 +1200,15 @@ private static SyntaxNode WithAttributeLists(SyntaxNode declaration, SyntaxList< _ => declaration, }; - internal override ImmutableArray GetPrimaryConstructorParameterList(SyntaxNode declaration) + internal override SyntaxNode? GetPrimaryConstructorParameterList(SyntaxNode declaration) { if (declaration is TypeDeclarationSyntax) { var paramList = declaration.GetParameterList(); if (paramList is not null) - return [paramList]; + return paramList; } - return []; + return null; } internal override ImmutableArray GetTypeInheritance(SyntaxNode declaration) diff --git a/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs b/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs index 23542b315c784..427d9f3535086 100644 --- a/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs +++ b/src/Workspaces/Core/Portable/Editing/SyntaxGenerator.cs @@ -1072,9 +1072,12 @@ public SyntaxNode RemoveAllAttributes(SyntaxNode declaration) internal abstract SyntaxNode RemoveAllComments(SyntaxNode node); internal SyntaxNode RemovePrimaryConstructor(SyntaxNode declaration) - => RemoveNodes(declaration, GetPrimaryConstructorParameterList(declaration)); + { + var node = GetPrimaryConstructorParameterList(declaration); + return RemoveNodes(declaration, node is not null ? [node] : []); + } - internal abstract ImmutableArray GetPrimaryConstructorParameterList(SyntaxNode declaration); + internal abstract SyntaxNode? GetPrimaryConstructorParameterList(SyntaxNode declaration); internal SyntaxNode RemoveLeadingAndTrailingComments(SyntaxNode node) { diff --git a/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb b/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb index b7a0856863bd5..bcfa7cbc632d4 100644 --- a/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb +++ b/src/Workspaces/VisualBasic/Portable/CodeGeneration/VisualBasicSyntaxGenerator.vb @@ -1675,8 +1675,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGeneration Return attr.WithTarget(Nothing) End Function - Friend Overrides Function GetPrimaryConstructorParameterList(declaration As SyntaxNode) As ImmutableArray(Of SyntaxNode) - Return ImmutableArray(Of SyntaxNode).Empty + Friend Overrides Function GetPrimaryConstructorParameterList(declaration As SyntaxNode) As SyntaxNode + Return Nothing End Function Friend Overrides Function GetTypeInheritance(declaration As SyntaxNode) As ImmutableArray(Of SyntaxNode) From 87c3653ab5ff97f0a741ec4d627233761a859ae1 Mon Sep 17 00:00:00 2001 From: juan-carlos-diaz <43589627+juan-carlos-diaz@users.noreply.github.com> Date: Sat, 23 Mar 2024 19:59:07 -0400 Subject: [PATCH 6/6] Update src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs Co-authored-by: Cyrus Najmabadi --- .../Portable/CodeGeneration/CSharpSyntaxGenerator.cs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs index 0f269577a2e3b..5a0714b9452d1 100644 --- a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs +++ b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs @@ -1201,15 +1201,7 @@ private static SyntaxNode WithAttributeLists(SyntaxNode declaration, SyntaxList< }; internal override SyntaxNode? GetPrimaryConstructorParameterList(SyntaxNode declaration) - { - if (declaration is TypeDeclarationSyntax) - { - var paramList = declaration.GetParameterList(); - if (paramList is not null) - return paramList; - } - return null; - } + => declaration is TypeDeclarationSyntax { ParameterList: { } parameterList } ? parameterList : null; internal override ImmutableArray GetTypeInheritance(SyntaxNode declaration) => declaration is BaseTypeDeclarationSyntax baseType && baseType.BaseList != null