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:
committed by
Commit Queue
parent
4465415015
commit
2bfdb03c4a
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user