diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_primary_constructor.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_primary_constructor.dart index 30dda5abca0..3a2033962e2 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_primary_constructor.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_primary_constructor.dart @@ -68,13 +68,16 @@ class ConvertToPrimaryConstructor extends ResolvedCorrectionProducer { if (constructor.constKeyword != null && !containerData.isEnum) { builder.addSimpleInsertion(containerData.name.offset, 'const '); } - builder.addInsertion(containerData.name.end, (builder) { - if (constructor.name case var name?) { - builder.write('.'); - builder.write(name.lexeme); - } - builder.write(_parameterText(constructor.parameters)); - }); + builder.addInsertion( + containerData.typeParameters?.end ?? containerData.name.end, + (builder) { + if (constructor.name case var name?) { + builder.write('.'); + builder.write(name.lexeme); + } + builder.write(_parameterText(constructor.parameters)); + }, + ); // Remove the constructor that was converted. // @@ -104,39 +107,24 @@ class ConvertToPrimaryConstructor extends ResolvedCorrectionProducer { /// Returns information about the declaration in which the [constructor] is /// declared. _ContainerData? _getContainerData(ConstructorDeclaration constructor) { - Token name; - bool hasPrimaryConstructor; - int nonRedirectingGenerativeConstructorCount; - bool isEnum = false; - var parent = constructor.parent; - switch (parent) { - case BlockClassBody body: - parent = body.parent; - case BlockEnumBody body: - parent = body.parent; - } - switch (parent) { - case ClassDeclaration(:var namePart): - name = namePart.typeName; - hasPrimaryConstructor = namePart is PrimaryConstructorDeclaration; - nonRedirectingGenerativeConstructorCount = - _nonRedirectingGenerativeConstructorCount(parent.classMembers); - case EnumDeclaration(:var namePart): - name = namePart.typeName; - hasPrimaryConstructor = namePart is PrimaryConstructorDeclaration; - nonRedirectingGenerativeConstructorCount = - _nonRedirectingGenerativeConstructorCount(parent.classMembers); - isEnum = true; - default: - return null; - } - return _ContainerData( - name: name, - hasPrimaryConstructor: hasPrimaryConstructor, - hasMultipleNonRedirectingGenerativeConstructors: - nonRedirectingGenerativeConstructorCount > 1, - isEnum: isEnum, - ); + var parent = switch (constructor.parent) { + BlockClassBody body => body.parent, + BlockEnumBody body => body.parent, + var parent => parent, + }; + + return switch (parent) { + ClassDeclaration(:var namePart) || + EnumDeclaration(:var namePart) => _ContainerData( + name: namePart.typeName, + typeParameters: namePart.typeParameters, + hasPrimaryConstructor: namePart is PrimaryConstructorDeclaration, + hasMultipleNonRedirectingGenerativeConstructors: + _nonRedirectingGenerativeConstructorCount(parent.classMembers) > 1, + isEnum: parent is EnumDeclaration, + ), + _ => null, + }; } /// Returns the number of non-redirecting generative constructors in the list @@ -163,6 +151,10 @@ class _ContainerData { /// The name of the class or enum. Token name; + /// The type parameters on the class or enum or `null` if the type isn't + /// generic. + TypeParameterList? typeParameters; + /// Whether the class or enum already has a primary constructor. bool hasPrimaryConstructor; @@ -175,6 +167,7 @@ class _ContainerData { _ContainerData({ required this.name, + required this.typeParameters, required this.hasPrimaryConstructor, required this.hasMultipleNonRedirectingGenerativeConstructors, required this.isEnum, diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_primary_constructor_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_primary_constructor_test.dart index 2d660077a58..460347df76d 100644 --- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_primary_constructor_test.dart +++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_primary_constructor_test.dart @@ -20,6 +20,18 @@ class ConvertToPrimaryConstructorClassTest extends AssistProcessorTest { @override AssistKind get kind => DartAssistKind.convertToPrimaryConstructor; + Future test_genericClass() async { + await resolveTestCode(''' +class C { + C^(); +} +'''); + await assertHasAssist(''' +class C() { +} +'''); + } + Future test_noParameters_noBody_named() async { await resolveTestCode(''' class C { @@ -483,6 +495,20 @@ class ConvertToPrimaryConstructorEnumTest extends AssistProcessorTest { @override AssistKind get kind => DartAssistKind.convertToPrimaryConstructor; + Future test_genericEnum() async { + await resolveTestCode(''' +enum C { + a; + C^(); +} +'''); + await assertHasAssist(''' +enum C() { + a; +} +'''); + } + Future test_noParameters_noBody() async { await resolveTestCode(''' enum E {