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 <scheglov@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
This commit is contained in:
Sam Rawlins
2026-01-17 17:33:05 -08:00
committed by Commit Queue
parent 4465415015
commit 2bfdb03c4a
2 changed files with 77 additions and 24 deletions
@@ -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<ConstructorDeclaration>()
.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()');
});
}
});
@@ -232,7 +232,7 @@ E e() {
await assertNoFix();
}
Future<void> test_named_non_zero() async {
Future<void> test_named_nonZeroParameters() async {
await resolveTestCode('''
enum E {
ONE.named(1);
@@ -249,7 +249,7 @@ E e() {
await assertNoFix();
}
Future<void> test_named_non_zero_dotShorthand() async {
Future<void> test_named_nonZeroParameters_dotShorthand() async {
await resolveTestCode('''
enum E {
ONE.named(1);
@@ -283,6 +283,36 @@ E e() {
await assertNoFix();
}
Future<void> 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<void> test_namedPrimary_nonZeroParameters() async {
await resolveTestCode('''
enum E.named(final int i) {
one.named(1);
}
E e = E.two;
''');
await assertNoFix();
}
Future<void> test_toEmpty() async {
await resolveTestCode('''
enum E {}
@@ -381,7 +411,7 @@ E e() {
''');
}
Future<void> test_unnamed_non_zero() async {
Future<void> test_unnamed_nonZeroParameters() async {
await resolveTestCode('''
enum E {
ONE(1);
@@ -393,6 +423,36 @@ enum E {
E e() {
return E.TWO;
}
''');
await assertNoFix();
}
Future<void> test_unnamedPrimary() async {
await resolveTestCode('''
enum E() {
one;
}
E e = E.two;
''');
await assertHasFix('''
enum E() {
one, two;
}
E e = E.two;
''');
}
Future<void> test_unnamedPrimary_nonZeroParameters() async {
await resolveTestCode('''
enum E(final int i) {
one(1);
}
E e = E.two;
''');
await assertNoFix();