From 2bfdb03c4afd1592ca3c35bfa8e87c19a9db0c95 Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Sat, 17 Jan 2026 17:33:05 -0800 Subject: [PATCH] DAS: support add_enum_constant fix for primary constructors Fixes https://github.com/dart-lang/sdk/issues/61704 Change-Id: Ib38bb2f798b4ba74921ea1b040fad48a1cc556a2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/474020 Reviewed-by: Konstantin Shcheglov Commit-Queue: Samuel Rawlins --- .../correction/dart/add_enum_constant.dart | 35 ++++------ .../fix/add_enum_constant_test.dart | 66 ++++++++++++++++++- 2 files changed, 77 insertions(+), 24 deletions(-) diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_enum_constant.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_enum_constant.dart index 69d26694b9f..97c01ccc644 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/add_enum_constant.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/add_enum_constant.dart @@ -51,43 +51,36 @@ class AddEnumConstant extends ResolvedCorrectionProducer { var targetDeclarationResult = await sessionHelper.getFragmentDeclaration( targetFragment, ); - if (targetDeclarationResult == null) return; - var targetNode = targetDeclarationResult.node; + var targetNode = targetDeclarationResult?.node; if (targetNode is! EnumDeclaration) return; - var targetUnit = targetDeclarationResult.resolvedUnit; - if (targetUnit == null) return; + var constructors = targetElement.constructors + .where((c) => !c.isFactory) + .toList(); + if (constructors.any((c) => c.formalParameters.isNotEmpty)) return; - var targetSource = targetFragment.libraryFragment.source; - var targetFile = targetSource.fullName; - - var constructors = targetNode.body.members - .whereType() - .where((con) => con.factoryKeyword == null); - - if (constructors.any((con) => con.parameters.parameters.isNotEmpty)) { - return; + String? constructorName; + if (constructors.isNotEmpty) { + if (constructors.length > 1) return; + if (constructors.first.name != 'new') { + constructorName = constructors.first.name; + } } - var length = constructors.length; - if (length > 1) return; - - var constructorName = length == 1 ? constructors.first.name?.lexeme : null; - var addition = constructorName != null ? '.$constructorName()' : ''; - var lastConstant = targetNode.body.constants.lastOrNull; + var targetFile = targetFragment.libraryFragment.source.fullName; await builder.addDartFileEdit(targetFile, (builder) { if (lastConstant != null) { builder.addInsertion(lastConstant.end, (builder) { builder.write(', '); builder.write(_constantName); - builder.write(addition); + if (constructorName != null) builder.write('.$constructorName()'); }); } else { builder.addInsertion(targetNode.body.rightBracket.offset, (builder) { builder.write(_constantName); - builder.write(addition); + if (constructorName != null) builder.write('.$constructorName()'); }); } }); diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_enum_constant_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_enum_constant_test.dart index cbc0071c8a7..c9dfcb6feab 100644 --- a/pkg/analysis_server/test/src/services/correction/fix/add_enum_constant_test.dart +++ b/pkg/analysis_server/test/src/services/correction/fix/add_enum_constant_test.dart @@ -232,7 +232,7 @@ E e() { await assertNoFix(); } - Future test_named_non_zero() async { + Future test_named_nonZeroParameters() async { await resolveTestCode(''' enum E { ONE.named(1); @@ -249,7 +249,7 @@ E e() { await assertNoFix(); } - Future test_named_non_zero_dotShorthand() async { + Future test_named_nonZeroParameters_dotShorthand() async { await resolveTestCode(''' enum E { ONE.named(1); @@ -283,6 +283,36 @@ E e() { await assertNoFix(); } + Future test_namedPrimary() async { + await resolveTestCode(''' +enum E.named() { + one.named(); +} + +E e = E.two; +'''); + + await assertHasFix(''' +enum E.named() { + one.named(), two.named(); +} + +E e = E.two; +'''); + } + + Future test_namedPrimary_nonZeroParameters() async { + await resolveTestCode(''' +enum E.named(final int i) { + one.named(1); +} + +E e = E.two; +'''); + + await assertNoFix(); + } + Future test_toEmpty() async { await resolveTestCode(''' enum E {} @@ -381,7 +411,7 @@ E e() { '''); } - Future test_unnamed_non_zero() async { + Future test_unnamed_nonZeroParameters() async { await resolveTestCode(''' enum E { ONE(1); @@ -393,6 +423,36 @@ enum E { E e() { return E.TWO; } +'''); + + await assertNoFix(); + } + + Future test_unnamedPrimary() async { + await resolveTestCode(''' +enum E() { + one; +} + +E e = E.two; +'''); + + await assertHasFix(''' +enum E() { + one, two; +} + +E e = E.two; +'''); + } + + Future test_unnamedPrimary_nonZeroParameters() async { + await resolveTestCode(''' +enum E(final int i) { + one(1); +} + +E e = E.two; '''); await assertNoFix();