diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_break.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_break.dart new file mode 100644 index 00000000000..a7cd1ec8322 --- /dev/null +++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_break.dart @@ -0,0 +1,36 @@ +// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart'; +import 'package:analysis_server/src/services/correction/fix.dart'; +import 'package:analyzer/dart/ast/ast.dart'; +import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart'; +import 'package:analyzer_plugin/utilities/fixes/fixes.dart'; +import 'package:analyzer_plugin/utilities/range_factory.dart'; + +class RemoveBreak extends CorrectionProducer { + @override + bool get canBeAppliedInBulk => true; + + @override + bool get canBeAppliedToFile => true; + + @override + FixKind get fixKind => DartFixKind.REMOVE_BREAK; + + @override + FixKind get multiFixKind => DartFixKind.REMOVE_BREAK_MULTI; + + @override + Future compute(ChangeBuilder builder) async { + final breakStatement = node; + if (breakStatement is BreakStatement) { + await builder.addDartFileEdit(file, (builder) { + var start = utils.getLineContentStart(breakStatement.offset); + var end = utils.getLineContentEnd(breakStatement.end); + builder.addDeletion(range.startOffsetEndOffset(start, end)); + }); + } + } +} diff --git a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml index f7449f64199..ddf6ba43682 100644 --- a/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml +++ b/pkg/analysis_server/lib/src/services/correction/error_fix_status.yaml @@ -2001,9 +2001,7 @@ LintCode.unnecessary_await_in_return: LintCode.unnecessary_brace_in_string_interps: status: hasFix LintCode.unnecessary_breaks: - status: needsFix - notes: |- - https://github.com/dart-lang/sdk/issues/49960 + status: hasFix LintCode.unnecessary_const: status: hasFix LintCode.unnecessary_constructor_name: diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart index 86fe2787d55..bf989dba8ef 100644 --- a/pkg/analysis_server/lib/src/services/correction/fix.dart +++ b/pkg/analysis_server/lib/src/services/correction/fix.dart @@ -944,6 +944,16 @@ class DartFixKind { DartFixKindPriority.IN_FILE, 'Remove awaits in file', ); + static const REMOVE_BREAK = FixKind( + 'dart.fix.remove.break', + DartFixKindPriority.DEFAULT, + 'Remove break', + ); + static const REMOVE_BREAK_MULTI = FixKind( + 'dart.fix.remove.break.multi', + DartFixKindPriority.IN_FILE, + 'Remove unnecessary breaks in file', + ); static const REMOVE_CHARACTER = FixKind( 'dart.fix.remove.character', DartFixKindPriority.DEFAULT, diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart index 1e785731082..62e6e854987 100644 --- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart +++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart @@ -118,6 +118,7 @@ import 'package:analysis_server/src/services/correction/dart/remove_argument.dar import 'package:analysis_server/src/services/correction/dart/remove_assertion.dart'; import 'package:analysis_server/src/services/correction/dart/remove_assignment.dart'; import 'package:analysis_server/src/services/correction/dart/remove_await.dart'; +import 'package:analysis_server/src/services/correction/dart/remove_break.dart'; import 'package:analysis_server/src/services/correction/dart/remove_character.dart'; import 'package:analysis_server/src/services/correction/dart/remove_comparison.dart'; import 'package:analysis_server/src/services/correction/dart/remove_const.dart'; @@ -662,6 +663,9 @@ class FixProcessor extends BaseProcessor { LintNames.unnecessary_brace_in_string_interps: [ RemoveInterpolationBraces.new, ], + LintNames.unnecessary_breaks: [ + RemoveBreak.new, + ], LintNames.unnecessary_const: [ RemoveUnnecessaryConst.new, ], diff --git a/pkg/analysis_server/lib/src/services/linter/lint_names.dart b/pkg/analysis_server/lib/src/services/linter/lint_names.dart index f008de84ace..1525933002e 100644 --- a/pkg/analysis_server/lib/src/services/linter/lint_names.dart +++ b/pkg/analysis_server/lib/src/services/linter/lint_names.dart @@ -140,6 +140,7 @@ class LintNames { static const String unawaited_futures = 'unawaited_futures'; static const String unnecessary_brace_in_string_interps = 'unnecessary_brace_in_string_interps'; + static const String unnecessary_breaks = 'unnecessary_breaks'; static const String unnecessary_const = 'unnecessary_const'; static const String unnecessary_constructor_name = 'unnecessary_constructor_name'; diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_break_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_break_test.dart new file mode 100644 index 00000000000..51cca0bbf5e --- /dev/null +++ b/pkg/analysis_server/test/src/services/correction/fix/remove_break_test.dart @@ -0,0 +1,87 @@ +// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:analysis_server/src/services/correction/fix.dart'; +import 'package:analysis_server/src/services/linter/lint_names.dart'; +import 'package:analyzer_plugin/utilities/fixes/fixes.dart'; +import 'package:test_reflective_loader/test_reflective_loader.dart'; + +import 'fix_processor.dart'; + +void main() { + defineReflectiveSuite(() { + defineReflectiveTests(RemoveBreakBulkTest); + defineReflectiveTests(RemoveBreakTest); + }); +} + +@reflectiveTest +class RemoveBreakBulkTest extends BulkFixProcessorTest { + @override + List get experiments => ['patterns', 'records']; + + @override + String get lintCode => LintNames.unnecessary_breaks; + + Future test_singleFile() async { + await resolveTestCode(''' +f() { + switch (1) { + case 1: + f(); + break; + case 2: + f(); + break; + } +} +'''); + await assertHasFix(''' +f() { + switch (1) { + case 1: + f(); + case 2: + f(); + } +} +'''); + } +} + +@reflectiveTest +class RemoveBreakTest extends FixProcessorLintTest { + @override + List get experiments => ['patterns', 'records']; + + @override + FixKind get kind => DartFixKind.REMOVE_BREAK; + + @override + String get lintCode => LintNames.unnecessary_breaks; + + Future test_single() async { + await resolveTestCode(''' +f() { + switch (1) { + case 1: + f(); + break; + case 2: + f(); + } +} +'''); + await assertHasFix(''' +f() { + switch (1) { + case 1: + f(); + case 2: + f(); + } +} +'''); + } +} diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart index b38beb5d9bf..cc5a80414af 100644 --- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart +++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart @@ -147,6 +147,7 @@ import 'remove_argument_test.dart' as remove_argument; import 'remove_assertion_test.dart' as remove_assertion; import 'remove_assignment_test.dart' as remove_assignment; import 'remove_await_test.dart' as remove_await; +import 'remove_break_test.dart' as remove_break; import 'remove_character_test.dart' as remove_character; import 'remove_comparison_test.dart' as remove_comparison; import 'remove_const_test.dart' as remove_const; @@ -381,6 +382,7 @@ void main() { remove_assertion.main(); remove_assignment.main(); remove_await.main(); + remove_break.main(); remove_character.main(); remove_comparison.main(); remove_const.main();