quick fix for avoid_unnecessary_containers

Fixes: https://github.com/dart-lang/sdk/issues/45922

Change-Id: Icddecacce88f725bfa72a5b4c0a667250ba268bd
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/206420
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Phil Quitslund <pquitslund@google.com>
This commit is contained in:
pq 2021-07-09 22:43:20 +00:00 committed by commit-bot@chromium.org
parent 341facafc7
commit edb0220277
5 changed files with 133 additions and 0 deletions

View file

@ -4,15 +4,30 @@
import 'package:analysis_server/src/services/correction/assist.dart';
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/assist/assist.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 FlutterRemoveWidget extends CorrectionProducer {
@override
AssistKind get assistKind => DartAssistKind.FLUTTER_REMOVE_WIDGET;
/// todo(pq): find out why overlapping edits are not being applied (and enable)
@override
bool get canBeAppliedInBulk => false;
@override
bool get canBeAppliedToFile => false;
@override
FixKind get fixKind => DartFixKind.REMOVE_UNNECESSARY_CONTAINER;
@override
FixKind? get multiFixKind => DartFixKind.REMOVE_UNNECESSARY_CONTAINER_MULTI;
@override
Future<void> compute(ChangeBuilder builder) async {
var widgetCreation = flutter.identifyNewExpression(node);

View file

@ -606,6 +606,14 @@ class DartFixKind {
'dart.fix.remove.unnecessaryNew.multi',
DartFixKindPriority.IN_FILE,
'Remove unnecessary new keywords everywhere in file');
static const REMOVE_UNNECESSARY_CONTAINER = FixKind(
'dart.fix.remove.unnecessaryContainer',
DartFixKindPriority.DEFAULT,
"Remove unnecessary 'Container'");
static const REMOVE_UNNECESSARY_CONTAINER_MULTI = FixKind(
'dart.fix.remove.unnecessaryContainer.multi',
DartFixKindPriority.IN_FILE,
"Remove unnecessary 'Container's in file");
static const REMOVE_UNNECESSARY_PARENTHESES = FixKind(
'dart.fix.remove.unnecessaryParentheses',
DartFixKindPriority.DEFAULT,

View file

@ -77,6 +77,7 @@ import 'package:analysis_server/src/services/correction/dart/create_no_such_meth
import 'package:analysis_server/src/services/correction/dart/create_setter.dart';
import 'package:analysis_server/src/services/correction/dart/data_driven.dart';
import 'package:analysis_server/src/services/correction/dart/extend_class_for_mixin.dart';
import 'package:analysis_server/src/services/correction/dart/flutter_remove_widget.dart';
import 'package:analysis_server/src/services/correction/dart/ignore_diagnostic.dart';
import 'package:analysis_server/src/services/correction/dart/import_library.dart';
import 'package:analysis_server/src/services/correction/dart/inline_invocation.dart';
@ -379,6 +380,9 @@ class FixProcessor extends BaseProcessor {
// TODO(brianwilkerson) Consider applying in bulk.
RemoveUnusedParameter.newInstance,
],
LintNames.avoid_unnecessary_containers: [
FlutterRemoveWidget.newInstance,
],
LintNames.await_only_futures: [
RemoveAwait.newInstance,
],

View file

@ -36,6 +36,8 @@ class LintNames {
static const String avoid_unused_constructor_parameters =
'avoid_unused_constructor_parameters';
static const String await_only_futures = 'await_only_futures';
static const String avoid_unnecessary_containers =
'avoid_unnecessary_containers';
static const String curly_braces_in_flow_control_structures =
'curly_braces_in_flow_control_structures';
static const String diagnostic_describe_all_properties =

View file

@ -3,14 +3,20 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server/src/services/linter/lint_names.dart';
import 'package:analyzer_plugin/utilities/assist/assist.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../fix/fix_processor.dart';
import 'assist_processor.dart';
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(FlutterRemoveWidgetTest);
defineReflectiveTests(RemoveContainerTest);
defineReflectiveTests(RemoveContainerBulkTest);
});
}
@ -235,3 +241,101 @@ main() {
''');
}
}
@reflectiveTest
class RemoveContainerBulkTest extends BulkFixProcessorTest {
@override
String get lintCode => LintNames.avoid_unnecessary_containers;
@override
void setUp() {
super.setUp();
writeTestPackageConfig(
flutter: true,
);
}
@FailingTest(reason: 'nested row container not being removed')
Future<void> test_singleFile() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
Widget buildRow() {
return Container(
child: Row(
children: [
Text('...'),
Container(
child: Row(
children: [
Text('...'),
],
),
)
],
)
);
}
''');
await assertHasFix('''
import 'package:flutter/material.dart';
Widget buildRow() {
return Row(
children: [
Text('...'),
Row(
children: [
Text('...'),
],
)
],
);
}
''');
}
}
@reflectiveTest
class RemoveContainerTest extends FixProcessorLintTest {
@override
FixKind get kind => DartFixKind.REMOVE_UNNECESSARY_CONTAINER;
@override
String get lintCode => LintNames.avoid_unnecessary_containers;
@override
void setUp() {
super.setUp();
writeTestPackageConfig(
flutter: true,
);
}
Future<void> test_simple() async {
await resolveTestCode('''
import 'package:flutter/material.dart';
Widget buildRow() {
return Container(
child: Row(
children: [
Text('...'),
],
)
);
}
''');
await assertHasFix('''
import 'package:flutter/material.dart';
Widget buildRow() {
return Row(
children: [
Text('...'),
],
);
}
''');
}
}