[DAS] Refactors all wrap with builders to the same implementation
R=pquitslund@google.com
Fixes: https://github.com/dart-lang/sdk/issues/60075
Change-Id: I177830361f080e11321f8bd0c85929ab9b3871ae
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/408860
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Auto-Submit: Felipe Morschel <git@fmorschel.dev>
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 7f9651c..1531fe9 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -56,10 +56,7 @@
import 'package:analysis_server/src/services/correction/dart/flutter_swap_with_parent.dart';
import 'package:analysis_server/src/services/correction/dart/flutter_wrap.dart';
import 'package:analysis_server/src/services/correction/dart/flutter_wrap_builder.dart';
-import 'package:analysis_server/src/services/correction/dart/flutter_wrap_future_builder.dart';
import 'package:analysis_server/src/services/correction/dart/flutter_wrap_generic.dart';
-import 'package:analysis_server/src/services/correction/dart/flutter_wrap_stream_builder.dart';
-import 'package:analysis_server/src/services/correction/dart/flutter_wrap_value_listenable_builder.dart';
import 'package:analysis_server/src/services/correction/dart/import_add_show.dart';
import 'package:analysis_server/src/services/correction/dart/inline_invocation.dart';
import 'package:analysis_server/src/services/correction/dart/invert_conditional_expression.dart';
@@ -142,11 +139,7 @@
FlutterRemoveWidget.new,
FlutterSwapWithChild.new,
FlutterSwapWithParent.new,
- FlutterWrapBuilder.new,
- FlutterWrapFutureBuilder.new,
FlutterWrapGeneric.new,
- FlutterWrapStreamBuilder.new,
- FlutterWrapValueListenableBuilder.new,
ImportAddShow.new,
InlineInvocation.new,
InvertConditionalExpression.new,
@@ -171,6 +164,7 @@
/// The set of built-in multi-generators used to produce assists.
const Set<MultiProducerGenerator> _builtInMultiGenerators = {
FlutterWrap.new,
+ FlutterWrapBuilders.new,
SurroundWith.new,
};
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart
index 07865d8..f183bb5 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_builder.dart
@@ -5,24 +5,49 @@
import 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
import 'package:analyzer/src/dart/ast/extensions.dart';
+import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/utilities/extensions/flutter.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/range_factory.dart';
-// TODO(bkonyi): share common implementation between the various builder wrappers
-// See https://github.com/dart-lang/sdk/issues/60075
-class FlutterWrapBuilder extends ResolvedCorrectionProducer {
- FlutterWrapBuilder({required super.context});
+class FlutterWrapBuilders extends MultiCorrectionProducer {
+ FlutterWrapBuilders({required super.context});
+
+ @override
+ Future<List<ResolvedCorrectionProducer>> get producers async {
+ var producers = <ResolvedCorrectionProducer>[];
+ var widgetExpr = node.findWidgetExpression;
+ if (widgetExpr != null) {
+ producers.add(_FlutterWrapBuilder(context: context));
+ producers.add(_FlutterWrapValueListenableBuilder(context: context));
+ producers.add(_FlutterWrapStreamBuilder(context: context));
+ producers.add(_FlutterWrapFutureBuilder(context: context));
+ }
+ return producers;
+ }
+}
+
+abstract class _FlutterBaseWrapBuilder extends ResolvedCorrectionProducer {
+ final List<String> extraBuilderParams;
+ final List<String> extraNamedParams;
+ final String builderName;
+
+ _FlutterBaseWrapBuilder({
+ required super.context,
+ required this.builderName,
+ required this.extraNamedParams,
+ required this.extraBuilderParams,
+ });
@override
CorrectionApplicability get applicability =>
- // TODO(applicability): comment on why.
- CorrectionApplicability
- .singleLocation;
+ // TODO(applicability): comment on why.
+ CorrectionApplicability.singleLocation;
- @override
- AssistKind get assistKind => DartAssistKind.FLUTTER_WRAP_BUILDER;
+ bool canWrapOn(TypeImpl typeOrThrow) {
+ return !typeOrThrow.isExactWidgetTypeBuilder;
+ }
@override
Future<void> compute(ChangeBuilder builder) async {
@@ -30,16 +55,18 @@
if (widgetExpr == null) {
return;
}
- if (widgetExpr.typeOrThrow.isExactWidgetTypeBuilder) {
+ if (!canWrapOn(widgetExpr.typeOrThrow)) {
return;
}
var widgetSrc = utils.getNodeText(widgetExpr);
- var builderElement = await sessionHelper.getFlutterClass('Builder');
+ var builderElement = await sessionHelper.getFlutterClass(builderName);
if (builderElement == null) {
return;
}
+ var params = ['context', ...extraBuilderParams];
+
await builder.addDartFileEdit(file, (builder) {
builder.addReplacement(range.node(widgetExpr), (builder) {
builder.writeReference(builderElement);
@@ -50,8 +77,17 @@
var indentNew1 = indentOld + utils.oneIndent;
var indentNew2 = indentOld + utils.twoIndents;
+ var namedParams = extraNamedParams.join(', ');
+
+ if (namedParams.isNotEmpty) {
+ builder.write(indentNew1);
+ builder.write('$namedParams: ');
+ builder.addSimpleLinkedEdit('variable', namedParams);
+ builder.writeln(',');
+ }
+
builder.write(indentNew1);
- builder.writeln('builder: (context) {');
+ builder.writeln('builder: (${params.join(', ')}) {');
widgetSrc = utils.replaceSourceIndent(widgetSrc, indentOld, indentNew2);
builder.write(indentNew2);
@@ -69,3 +105,52 @@
});
}
}
+
+class _FlutterWrapBuilder extends _FlutterBaseWrapBuilder {
+ _FlutterWrapBuilder({required super.context})
+ : super(
+ builderName: 'Builder',
+ extraNamedParams: const [],
+ extraBuilderParams: const [],
+ );
+
+ @override
+ AssistKind get assistKind => DartAssistKind.FLUTTER_WRAP_BUILDER;
+}
+
+class _FlutterWrapFutureBuilder extends _FlutterBaseWrapBuilder {
+ _FlutterWrapFutureBuilder({required super.context})
+ : super(
+ builderName: 'FutureBuilder',
+ extraNamedParams: const ['future'],
+ extraBuilderParams: const ['asyncSnapshot'],
+ );
+
+ @override
+ AssistKind get assistKind => DartAssistKind.FLUTTER_WRAP_FUTURE_BUILDER;
+}
+
+class _FlutterWrapStreamBuilder extends _FlutterBaseWrapBuilder {
+ _FlutterWrapStreamBuilder({required super.context})
+ : super(
+ builderName: 'StreamBuilder',
+ extraNamedParams: const ['stream'],
+ extraBuilderParams: const ['asyncSnapshot'],
+ );
+
+ @override
+ AssistKind get assistKind => DartAssistKind.FLUTTER_WRAP_STREAM_BUILDER;
+}
+
+class _FlutterWrapValueListenableBuilder extends _FlutterBaseWrapBuilder {
+ _FlutterWrapValueListenableBuilder({required super.context})
+ : super(
+ builderName: 'ValueListenableBuilder',
+ extraNamedParams: const ['valueListenable'],
+ extraBuilderParams: const ['value', 'child'],
+ );
+
+ @override
+ AssistKind get assistKind =>
+ DartAssistKind.FLUTTER_WRAP_VALUE_LISTENABLE_BUILDER;
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_future_builder.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_future_builder.dart
deleted file mode 100644
index ccb097c..0000000
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_future_builder.dart
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (c) 2025, 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/assist.dart';
-import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
-import 'package:analyzer/src/utilities/extensions/flutter.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/range_factory.dart';
-
-// TODO(bkonyi): share common implementation between the various builder wrappers
-// See https://github.com/dart-lang/sdk/issues/60075
-class FlutterWrapFutureBuilder extends ResolvedCorrectionProducer {
- FlutterWrapFutureBuilder({required super.context});
-
- @override
- CorrectionApplicability get applicability =>
- // TODO(applicability): comment on why.
- CorrectionApplicability
- .singleLocation;
-
- @override
- AssistKind get assistKind => DartAssistKind.FLUTTER_WRAP_FUTURE_BUILDER;
-
- @override
- Future<void> compute(ChangeBuilder builder) async {
- var widgetExpr = node.findWidgetExpression;
- if (widgetExpr == null) {
- return;
- }
- var widgetSrc = utils.getNodeText(widgetExpr);
-
- var FutureBuilderElement = await sessionHelper.getFlutterClass(
- 'FutureBuilder',
- );
- if (FutureBuilderElement == null) {
- return;
- }
-
- await builder.addDartFileEdit(file, (builder) {
- builder.addReplacement(range.node(widgetExpr), (builder) {
- builder.writeReference(FutureBuilderElement);
-
- builder.write('<');
- builder.addSimpleLinkedEdit('type', 'Object');
- builder.writeln('>(');
-
- var indentOld = utils.getLinePrefix(widgetExpr.offset);
- var indentNew1 = indentOld + utils.oneIndent;
- var indentNew2 = indentOld + utils.twoIndents;
-
- builder.write(indentNew1);
- builder.writeln('future: null,');
-
- builder.write(indentNew1);
- builder.writeln('builder: (context, snapshot) {');
-
- widgetSrc = utils.replaceSourceIndent(widgetSrc, indentOld, indentNew2);
- builder.write(indentNew2);
- builder.write('return $widgetSrc');
- builder.writeln(';');
-
- builder.write(indentNew1);
- var addTrailingCommas =
- getCodeStyleOptions(unitResult.file).addTrailingCommas;
- builder.writeln('}${addTrailingCommas ? "," : ""}');
-
- builder.write(indentOld);
- builder.write(')');
- });
- });
- }
-}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart
deleted file mode 100644
index 1fb68d2..0000000
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_stream_builder.dart
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright (c) 2020, 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/assist.dart';
-import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
-import 'package:analyzer/src/dart/ast/extensions.dart';
-import 'package:analyzer/src/utilities/extensions/flutter.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/range_factory.dart';
-
-// TODO(bkonyi): share common implementation between the various builder wrappers
-// See https://github.com/dart-lang/sdk/issues/60075
-class FlutterWrapStreamBuilder extends ResolvedCorrectionProducer {
- FlutterWrapStreamBuilder({required super.context});
-
- @override
- CorrectionApplicability get applicability =>
- // TODO(applicability): comment on why.
- CorrectionApplicability
- .singleLocation;
-
- @override
- AssistKind get assistKind => DartAssistKind.FLUTTER_WRAP_STREAM_BUILDER;
-
- @override
- Future<void> compute(ChangeBuilder builder) async {
- var widgetExpr = node.findWidgetExpression;
- if (widgetExpr == null) {
- return;
- }
- if (widgetExpr.typeOrThrow.isExactWidgetTypeStreamBuilder) {
- return;
- }
- var widgetSrc = utils.getNodeText(widgetExpr);
-
- var streamBuilderElement = await sessionHelper.getFlutterClass(
- 'StreamBuilder',
- );
- if (streamBuilderElement == null) {
- return;
- }
-
- await builder.addDartFileEdit(file, (builder) {
- builder.addReplacement(range.node(widgetExpr), (builder) {
- builder.writeReference(streamBuilderElement);
-
- builder.write('<');
- builder.addSimpleLinkedEdit('type', 'Object');
- builder.writeln('>(');
-
- var indentOld = utils.getLinePrefix(widgetExpr.offset);
- var indentNew1 = indentOld + utils.oneIndent;
- var indentNew2 = indentOld + utils.twoIndents;
-
- builder.write(indentNew1);
- builder.writeln('stream: null,');
-
- builder.write(indentNew1);
- builder.writeln('builder: (context, snapshot) {');
-
- widgetSrc = utils.replaceSourceIndent(widgetSrc, indentOld, indentNew2);
- builder.write(indentNew2);
- builder.write('return $widgetSrc');
- builder.writeln(';');
-
- builder.write(indentNew1);
- var addTrailingCommas =
- getCodeStyleOptions(unitResult.file).addTrailingCommas;
- builder.writeln('}${addTrailingCommas ? "," : ""}');
-
- builder.write(indentOld);
- builder.write(')');
- });
- });
- }
-}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_value_listenable_builder.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_value_listenable_builder.dart
deleted file mode 100644
index d52dd51..0000000
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap_value_listenable_builder.dart
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (c) 2025, 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/assist.dart';
-import 'package:analysis_server_plugin/edit/dart/correction_producer.dart';
-import 'package:analyzer/src/utilities/extensions/flutter.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/range_factory.dart';
-
-// TODO(kenz): share common implementation between the various builder wrappers.
-// See https://github.com/dart-lang/sdk/issues/60075.
-class FlutterWrapValueListenableBuilder extends ResolvedCorrectionProducer {
- FlutterWrapValueListenableBuilder({required super.context});
-
- @override
- CorrectionApplicability get applicability =>
- // TODO(applicability): comment on why.
- CorrectionApplicability
- .singleLocation;
-
- @override
- AssistKind get assistKind =>
- DartAssistKind.FLUTTER_WRAP_VALUE_LISTENABLE_BUILDER;
-
- @override
- Future<void> compute(ChangeBuilder builder) async {
- var widgetExpr = node.findWidgetExpression;
- if (widgetExpr == null) {
- return;
- }
-
- var widgetSrc = utils.getNodeText(widgetExpr);
-
- var valueListenableBuilderElement = await sessionHelper.getFlutterClass(
- 'ValueListenableBuilder',
- );
- if (valueListenableBuilderElement == null) {
- return;
- }
-
- await builder.addDartFileEdit(file, (builder) {
- builder.addReplacement(range.node(widgetExpr), (builder) {
- builder.writeReference(valueListenableBuilderElement);
-
- builder.write('<');
- builder.addSimpleLinkedEdit('type', 'Object');
- builder.writeln('>(');
-
- var indentOld = utils.getLinePrefix(widgetExpr.offset);
- var indentNew1 = indentOld + utils.oneIndent;
- var indentNew2 = indentOld + utils.twoIndents;
-
- builder.write(indentNew1);
- builder.writeln('valueListenable: valueListenable,');
-
- builder.write(indentNew1);
- // If there is a ValueListenableBuilder above or below the Widget being
- // added that has a parameter named 'value', then this parameter named
- // 'value' will take precedence in the scope of this builder. This is a
- // known risk and is acceptable at this time. It is possible to improve
- // this logic in the future by looking for naming collisisons above and
- // below this Widget and giving the parameter a unique name.
- builder.writeln('builder: (context, value, child) {');
-
- widgetSrc = utils.replaceSourceIndent(widgetSrc, indentOld, indentNew2);
- builder.write(indentNew2);
- builder.write('return $widgetSrc');
- builder.writeln(';');
-
- builder.write(indentNew1);
- var addTrailingCommas =
- getCodeStyleOptions(unitResult.file).addTrailingCommas;
- builder.writeln('}${addTrailingCommas ? "," : ""}');
-
- builder.write(indentOld);
- builder.write(')');
- });
- });
- }
-}
diff --git a/pkg/analysis_server/test/src/cider/assists_test.dart b/pkg/analysis_server/test/src/cider/assists_test.dart
index 61ca57a..a535d45 100644
--- a/pkg/analysis_server/test/src/cider/assists_test.dart
+++ b/pkg/analysis_server/test/src/cider/assists_test.dart
@@ -77,9 +77,9 @@
import 'package:flutter/widgets.dart';
void f() {
- StreamBuilder<Object>(
- stream: null,
- builder: (context, snapshot) {
+ StreamBuilder(
+ stream: stream,
+ builder: (context, asyncSnapshot) {
return Text('a');
}
);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_future_builder_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_future_builder_test.dart
index cfecded..27218aa 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_future_builder_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_future_builder_test.dart
@@ -26,6 +26,19 @@
writeTestPackageConfig(flutter: true);
}
+ Future<void> test_aroundBuilder() async {
+ await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+
+void f() {
+ ^Builder(
+ builder: (context) => Text(''),
+ );
+}
+''');
+ await assertNoAssist();
+ }
+
Future<void> test_aroundFutureBuilder() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -41,9 +54,9 @@
import 'package:flutter/widgets.dart';
void f(Future<int> s) {
- FutureBuilder<Object>(
- future: null,
- builder: (context, snapshot) {
+ FutureBuilder(
+ future: future,
+ builder: (context, asyncSnapshot) {
return FutureBuilder(
future: s,
builder: (context, snapshot) => Text(''),
@@ -66,9 +79,9 @@
import 'package:flutter/widgets.dart';
void f() {
- FutureBuilder<Object>(
- future: null,
- builder: (context, snapshot) {
+ FutureBuilder(
+ future: future,
+ builder: (context, asyncSnapshot) {
return Text('a');
}
);
@@ -96,9 +109,9 @@
const TestWidget({super.key});
@override
Widget build(BuildContext context) {
- return FutureBuilder<Object>(
- future: null,
- builder: (context, snapshot) {
+ return FutureBuilder(
+ future: future,
+ builder: (context, asyncSnapshot) {
return const Text('hi');
}
);
@@ -127,9 +140,9 @@
const TestWidget({super.key});
@override
Widget build(BuildContext context) {
- return FutureBuilder<Object>(
- future: null,
- builder: (context, snapshot) {
+ return FutureBuilder(
+ future: future,
+ builder: (context, asyncSnapshot) {
return const Text('hi');
},
);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
index 36cb8e9..f3aca13 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
@@ -26,6 +26,19 @@
writeTestPackageConfig(flutter: true);
}
+ Future<void> test_aroundBuilder() async {
+ await resolveTestCode('''
+import 'package:flutter/widgets.dart';
+
+void f(Stream<int> s) {
+ ^Builder(
+ builder: (context) => Text(''),
+ );
+}
+''');
+ await assertNoAssist();
+ }
+
Future<void> test_aroundStreamBuilder() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -33,11 +46,25 @@
void f(Stream<int> s) {
^StreamBuilder(
stream: s,
- builder: (context, snapshot) => Text(''),
+ builder: (context, asyncSnapshot) => Text(''),
);
}
''');
- await assertNoAssist();
+ await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+void f(Stream<int> s) {
+ StreamBuilder(
+ stream: stream,
+ builder: (context, asyncSnapshot) {
+ return StreamBuilder(
+ stream: s,
+ builder: (context, asyncSnapshot) => Text(''),
+ );
+ }
+ );
+}
+''');
}
Future<void> test_aroundText() async {
@@ -52,9 +79,9 @@
import 'package:flutter/widgets.dart';
void f() {
- StreamBuilder<Object>(
- stream: null,
- builder: (context, snapshot) {
+ StreamBuilder(
+ stream: stream,
+ builder: (context, asyncSnapshot) {
return Text('a');
}
);
@@ -82,9 +109,9 @@
const TestWidget({super.key});
@override
Widget build(BuildContext context) {
- return StreamBuilder<Object>(
- stream: null,
- builder: (context, snapshot) {
+ return StreamBuilder(
+ stream: stream,
+ builder: (context, asyncSnapshot) {
return const Text('hi');
}
);
@@ -113,9 +140,9 @@
const TestWidget({super.key});
@override
Widget build(BuildContext context) {
- return StreamBuilder<Object>(
- stream: null,
- builder: (context, snapshot) {
+ return StreamBuilder(
+ stream: stream,
+ builder: (context, asyncSnapshot) {
return const Text('hi');
},
);
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_value_listenable_builder_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_value_listenable_builder_test.dart
index 8304343..512a489 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_value_listenable_builder_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_value_listenable_builder_test.dart
@@ -26,6 +26,21 @@
writeTestPackageConfig(flutter: true);
}
+ Future<void> test_aroundBuilder() async {
+ await resolveTestCode('''
+ import 'package:flutter/widgets.dart';
+
+ void f(ValueListenable<int> v) {
+ ^Builder(
+ builder: (context) {
+ return Text('a');
+ },
+ );
+ }
+ ''');
+ await assertNoAssist();
+ }
+
Future<void> test_aroundText() async {
await resolveTestCode('''
import 'package:flutter/widgets.dart';
@@ -38,7 +53,7 @@
import 'package:flutter/widgets.dart';
void f() {
- ValueListenableBuilder<Object>(
+ ValueListenableBuilder(
valueListenable: valueListenable,
builder: (context, value, child) {
return Text('a');
@@ -65,7 +80,7 @@
import 'package:flutter/widgets.dart';
void f(ValueListenable<int> v) {
- ValueListenableBuilder<Object>(
+ ValueListenableBuilder(
valueListenable: valueListenable,
builder: (context, value, child) {
return ValueListenableBuilder<int>(
@@ -100,7 +115,7 @@
ValueListenableBuilder<int>(
valueListenable: v,
builder: (context, value, _) {
- return ValueListenableBuilder<Object>(
+ return ValueListenableBuilder(
valueListenable: valueListenable,
builder: (context, value, child) {
return Text('a');
@@ -132,7 +147,7 @@
const TestWidget({super.key});
@override
Widget build(BuildContext context) {
- return ValueListenableBuilder<Object>(
+ return ValueListenableBuilder(
valueListenable: valueListenable,
builder: (context, value, child) {
return const Text('hi');
@@ -163,7 +178,7 @@
const TestWidget({super.key});
@override
Widget build(BuildContext context) {
- return ValueListenableBuilder<Object>(
+ return ValueListenableBuilder(
valueListenable: valueListenable,
builder: (context, value, child) {
return const Text('hi');
diff --git a/pkg/analyzer/lib/src/utilities/extensions/flutter.dart b/pkg/analyzer/lib/src/utilities/extensions/flutter.dart
index 3495da2..9544c9b 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/flutter.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/flutter.dart
@@ -21,15 +21,11 @@
const _nameState = 'State';
const _nameStatefulWidget = 'StatefulWidget';
const _nameStatelessWidget = 'StatelessWidget';
-const _nameStreamBuilder = 'StreamBuilder';
const _nameWidget = 'Widget';
final Uri _uriAlignment = Uri.parse(
'package:flutter/src/painting/alignment.dart',
);
-final Uri _uriAsync = Uri.parse(
- 'package:flutter/src/widgets/async.dart',
-);
final Uri _uriBasic = Uri.parse(
'package:flutter/src/widgets/basic.dart',
);
@@ -48,7 +44,6 @@
final Uri _uriWidgetsIcon = Uri.parse(
'package:flutter/src/widgets/icon.dart',
);
-
final Uri _uriWidgetsText = Uri.parse(
'package:flutter/src/widgets/text.dart',
);
@@ -232,7 +227,7 @@
self.element3._isExactly(_nameAlign, _uriBasic);
}
- /// Whether this is the Flutter class `StreamBuilder`.
+ /// Whether this is the Flutter class `Builder`.
bool get isExactWidgetTypeBuilder {
var self = this;
return self is InterfaceType &&
@@ -281,13 +276,6 @@
self.element3._isExactly(_nameSizedBox, _uriBasic);
}
- /// Whether this is the Flutter class `StreamBuilder`.
- bool get isExactWidgetTypeStreamBuilder {
- var self = this;
- return self is InterfaceType &&
- self.element3._isExactly(_nameStreamBuilder, _uriAsync);
- }
-
/// Whether this is the Flutter class `Widget`, or its subtype.
bool get isListOfWidgetsType {
var self = this;