From 87d431e8de4d3be99686d06c4d4be25672deb30e Mon Sep 17 00:00:00 2001 From: Danny Tuppeny Date: Thu, 25 Jun 2020 17:17:12 +0000 Subject: [PATCH] Improve flutter wrap assists when caret is at the offset of an argument list Bug: https://github.com/Dart-Code/Dart-Code/issues/2492 Change-Id: I296f9396b3eedcbd1a63f272ed34c65f9d95d83b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/152521 Reviewed-by: Brian Wilkerson Commit-Queue: Danny Tuppeny --- .../correction/dart/flutter_wrap.dart | 14 ++++++++- .../assist/flutter_wrap_column_test.dart | 30 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) 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'), + ], + ), + ); + } +} '''); } }