diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart index 0c077db5ff2..f03127c8739 100644 --- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart +++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_wrap.dart @@ -46,7 +46,19 @@ class FlutterWrap extends MultiCorrectionProducer { widgetExpressions.add(selectedNode); } } else { - var widget = flutter.identifyWidgetExpression(analyzer.coveringNode); + var coveringNode = analyzer.coveringNode; + + // If the coveringNode is an argument list but the caret is exactly at the + // start (before the opening paren) we should use the parent instead + // as the user associates this location with the widget name: + // + // Text^('foo') + if (coveringNode is ArgumentList && + coveringNode.offset == selectionOffset) { + coveringNode = coveringNode.parent; + } + + var widget = flutter.identifyWidgetExpression(coveringNode); if (widget != null) { widgetExpressions.add(widget); } diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart index ce2a3ba2541..c16385a6550 100644 --- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart +++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart @@ -118,6 +118,36 @@ class FakeFlutter { ]); } } +'''); + } + + Future test_endOfWidgetName() async { + addFlutterPackage(); + await resolveTestUnit(''' +import 'package:flutter/widgets.dart'; + +class FakeFlutter { + main() { + return Container( + child: Text/*caret*/('aaa'), + ); + } +} +'''); + await assertHasAssist(''' +import 'package:flutter/widgets.dart'; + +class FakeFlutter { + main() { + return Container( + child: Column( + children: [ + Text('aaa'), + ], + ), + ); + } +} '''); } }