1
0
mirror of https://github.com/dart-lang/sdk synced 2024-07-08 20:16:39 +00:00

quick fixes for SUBTYPE_OF_{BASE,FINAL}_IS_NOT_BASE_FINAL_OR_SEALED

Quick fixes for:

* `SUBTYPE_OF_BASE_IS_NOT_BASE_FINAL_OR_SEALED`
* `SUBTYPE_OF_FINAL_IS_NOT_BASE_FINAL_OR_SEALED`

See: https://github.com/dart-lang/sdk/issues/55917

Change-Id: I1ee373fb030a1570f93e3a7bee694aa0ecc974f0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/371683
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Auto-Submit: Phil Quitslund <pquitslund@google.com>
Commit-Queue: Phil Quitslund <pquitslund@google.com>
This commit is contained in:
pq 2024-06-14 20:16:46 +00:00 committed by Commit Queue
parent 8fcba75132
commit de63980b40
5 changed files with 156 additions and 33 deletions

View File

@ -9,26 +9,43 @@ import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dar
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
class AddClassModifier extends ResolvedCorrectionProducer {
final String _modifier;
final String modifier;
AddClassModifier.base({required CorrectionProducerContext context})
: this._('base', context: context);
@override
final FixKind fixKind;
AddClassModifier._(this._modifier, {required super.context});
@override
final FixKind multiFixKind;
AddClassModifier.baseModifier({required CorrectionProducerContext context})
: this._(
context: context,
modifier: 'base',
fixKind: DartFixKind.ADD_CLASS_MODIFIER_BASE,
multiFixKind: DartFixKind.ADD_CLASS_MODIFIER_BASE_MULTI);
AddClassModifier.finalModifier({required CorrectionProducerContext context})
: this._(
context: context,
modifier: 'final',
fixKind: DartFixKind.ADD_CLASS_MODIFIER_FINAL,
multiFixKind: DartFixKind.ADD_CLASS_MODIFIER_FINAL_MULTI);
AddClassModifier.sealedModifier({required CorrectionProducerContext context})
: this._(
context: context,
modifier: 'sealed',
fixKind: DartFixKind.ADD_CLASS_MODIFIER_SEALED,
multiFixKind: DartFixKind.ADD_CLASS_MODIFIER_SEALED_MULTI);
AddClassModifier._(
{required super.context,
required this.modifier,
required this.fixKind,
required this.multiFixKind});
@override
CorrectionApplicability get applicability =>
CorrectionApplicability.acrossSingleFile;
@override
List<String> get fixArguments => [_modifier];
@override
FixKind get fixKind => DartFixKind.ADD_CLASS_MODIFIER;
@override
FixKind get multiFixKind => DartFixKind.ADD_CLASS_MODIFIER_MULTI;
@override
Future<void> compute(ChangeBuilder builder) async {
var node = this.node;
@ -36,7 +53,7 @@ class AddClassModifier extends ResolvedCorrectionProducer {
await builder.addDartFileEdit(file, (builder) {
builder.addSimpleInsertion(
node.firstTokenAfterCommentAndMetadata.offset, '$_modifier ');
node.firstTokenAfterCommentAndMetadata.offset, '$modifier ');
});
}
}

View File

@ -45,8 +45,8 @@
#
# Stats:
# - 42 "needsEvaluation"
# - 321 "needsFix"
# - 426 "hasFix"
# - 318 "needsFix"
# - 429 "hasFix"
# - 517 "noFix"
AnalysisOptionsErrorCode.INCLUDED_FILE_PARSE_ERROR:
@ -1457,13 +1457,9 @@ CompileTimeErrorCode.SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY:
CompileTimeErrorCode.STATIC_ACCESS_TO_INSTANCE_MEMBER:
status: noFix
CompileTimeErrorCode.SUBTYPE_OF_BASE_IS_NOT_BASE_FINAL_OR_SEALED:
status: needsFix
notes: |-
Add `base`, `final`, or `sealed`.
status: hasFix
CompileTimeErrorCode.SUBTYPE_OF_FINAL_IS_NOT_BASE_FINAL_OR_SEALED:
status: needsFix
notes: |-
Add `base`, `final`, or `sealed`.
status: hasFix
CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_TYPE_IS_NOT_SUBTYPE_OF_ASSOCIATED:
status: hasFix
since: 2.17

View File

@ -61,15 +61,35 @@ class DartFixKind {
DartFixKindPriority.IN_FILE,
'Add empty argument lists everywhere in file',
);
static const ADD_CLASS_MODIFIER = FixKind(
'dart.fix.add.class.modifier',
static const ADD_CLASS_MODIFIER_BASE = FixKind(
'dart.fix.add.class.modifier.base',
DartFixKindPriority.DEFAULT,
"Add ''{0}'' modifier",
"Add 'base' modifier",
);
static const ADD_CLASS_MODIFIER_MULTI = FixKind(
'dart.fix.add.class.modifier.multi',
static const ADD_CLASS_MODIFIER_BASE_MULTI = FixKind(
'dart.fix.add.class.modifier.base.multi',
DartFixKindPriority.IN_FILE,
"Add ''{0}'' modifier everywhere in file",
"Add 'base' modifier everywhere in file",
);
static const ADD_CLASS_MODIFIER_FINAL = FixKind(
'dart.fix.add.class.modifier.final',
DartFixKindPriority.DEFAULT,
"Add 'final' modifier",
);
static const ADD_CLASS_MODIFIER_FINAL_MULTI = FixKind(
'dart.fix.add.class.modifier.final.multi',
DartFixKindPriority.IN_FILE,
"Add 'final' modifier everywhere in file",
);
static const ADD_CLASS_MODIFIER_SEALED = FixKind(
'dart.fix.add.class.modifier.sealed',
DartFixKindPriority.DEFAULT,
"Add 'sealed' modifier",
);
static const ADD_CLASS_MODIFIER_SEALED_MULTI = FixKind(
'dart.fix.add.class.modifier.sealed.multi',
DartFixKindPriority.IN_FILE,
"Add 'sealed' modifier everywhere in file",
);
static const ADD_CONST = FixKind(
'dart.fix.add.const',

View File

@ -1072,10 +1072,10 @@ final _builtInNonLintProducers = <ErrorCode, List<ProducerGenerator>>{
RemoveExtendsClause.new,
],
CompileTimeErrorCode.MIXIN_SUBTYPE_OF_BASE_IS_NOT_BASE: [
AddClassModifier.base,
AddClassModifier.baseModifier,
],
CompileTimeErrorCode.MIXIN_SUBTYPE_OF_FINAL_IS_NOT_BASE: [
AddClassModifier.base,
AddClassModifier.baseModifier,
],
CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS: [
RemoveNameFromDeclarationClause.new,
@ -1185,6 +1185,16 @@ final _builtInNonLintProducers = <ErrorCode, List<ProducerGenerator>>{
MakeReturnTypeNullable.new,
ReplaceReturnType.new,
],
CompileTimeErrorCode.SUBTYPE_OF_BASE_IS_NOT_BASE_FINAL_OR_SEALED: [
AddClassModifier.baseModifier,
AddClassModifier.finalModifier,
AddClassModifier.sealedModifier,
],
CompileTimeErrorCode.SUBTYPE_OF_FINAL_IS_NOT_BASE_FINAL_OR_SEALED: [
AddClassModifier.baseModifier,
AddClassModifier.finalModifier,
AddClassModifier.sealedModifier,
],
CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_TYPE_IS_NOT_SUBTYPE_OF_ASSOCIATED:
[
RemoveTypeAnnotation.other,

View File

@ -10,14 +10,16 @@ import 'fix_processor.dart';
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(AddClassModifierTest);
defineReflectiveTests(AddClassModifierBaseTest);
defineReflectiveTests(AddClassModifierFinalTest);
defineReflectiveTests(AddClassModifierSealedTest);
});
}
@reflectiveTest
class AddClassModifierTest extends FixProcessorTest {
class AddClassModifierBaseTest extends FixProcessorTest {
@override
FixKind get kind => DartFixKind.ADD_CLASS_MODIFIER;
FixKind get kind => DartFixKind.ADD_CLASS_MODIFIER_BASE;
Future<void> test_mixinSubtypeOfBaseIsNotBase() async {
await resolveTestCode('''
@ -51,6 +53,84 @@ mixin B implements A {}
await assertHasFix('''
final class A {}
base mixin B implements A {}
''');
}
Future<void> test_subtypeOfBaseIsNotBaseFinalOrSealed() async {
await resolveTestCode('''
base class A {}
class B extends A {}
''');
await assertHasFix('''
base class A {}
base class B extends A {}
''');
}
Future<void> test_subtypeOfFinalIsNotBaseFinalOrSealed() async {
await resolveTestCode('''
final class A {}
class B extends A {}
''');
await assertHasFix('''
final class A {}
base class B extends A {}
''');
}
}
@reflectiveTest
class AddClassModifierFinalTest extends FixProcessorTest {
@override
FixKind get kind => DartFixKind.ADD_CLASS_MODIFIER_FINAL;
Future<void> test_subtypeOfBaseIsNotBaseFinalOrSealed() async {
await resolveTestCode('''
base class A {}
class B extends A {}
''');
await assertHasFix('''
base class A {}
final class B extends A {}
''');
}
Future<void> test_subtypeOfFinalIsNotBaseFinalOrSealed() async {
await resolveTestCode('''
final class A {}
class B extends A {}
''');
await assertHasFix('''
final class A {}
final class B extends A {}
''');
}
}
@reflectiveTest
class AddClassModifierSealedTest extends FixProcessorTest {
@override
FixKind get kind => DartFixKind.ADD_CLASS_MODIFIER_SEALED;
Future<void> test_subtypeOfBaseIsNotBaseFinalOrSealed() async {
await resolveTestCode('''
base class A {}
class B extends A {}
''');
await assertHasFix('''
base class A {}
sealed class B extends A {}
''');
}
Future<void> test_subtypeOfFinalIsNotBaseFinalOrSealed() async {
await resolveTestCode('''
final class A {}
class B extends A {}
''');
await assertHasFix('''
final class A {}
sealed class B extends A {}
''');
}
}