From 3e9a99df6a864ffd65969cc580fb4ecc7fa3f7fd Mon Sep 17 00:00:00 2001 From: Danny Tuppeny Date: Thu, 22 Sep 2022 18:28:28 +0000 Subject: [PATCH] [analysis_server] Handle prefixed Flutter widget creation expressions for assists Fixes https://github.com/Dart-Code/Dart-Code/issues/4169. Change-Id: I3b462c69520593cbb9db2dc30ae19b8c93deed20 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/260601 Reviewed-by: Brian Wilkerson Commit-Queue: Brian Wilkerson --- .../lib/src/utilities/flutter.dart | 26 ++++++----- .../assist/flutter_remove_widget_test.dart | 46 +++++++++++++++++++ 2 files changed, 60 insertions(+), 12 deletions(-) diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart index 534b09c0852..afc37f7de46 100644 --- a/pkg/analysis_server/lib/src/utilities/flutter.dart +++ b/pkg/analysis_server/lib/src/utilities/flutter.dart @@ -231,21 +231,23 @@ class Flutter { /// Return the instance creation expression that surrounds the given /// [node], if any, else null. The [node] may be the instance creation - /// expression itself or the identifier that names the constructor. + /// expression itself or an (optionally prefixed) identifier that names the + /// constructor. InstanceCreationExpression? identifyNewExpression(AstNode? node) { InstanceCreationExpression? newExpr; if (node is SimpleIdentifier) { - var parent = node.parent; - var grandParent = parent?.parent; - var greatGrandParent = grandParent?.parent; - if (parent is ConstructorName && - grandParent is InstanceCreationExpression) { - newExpr = grandParent; - } else if (grandParent is ConstructorName && - greatGrandParent is InstanceCreationExpression) { - newExpr = greatGrandParent; - } - } else if (node is InstanceCreationExpression) { + node = node.parent; + } + if (node is PrefixedIdentifier) { + node = node.parent; + } + if (node is NamedType) { + node = node.parent; + } + if (node is ConstructorName) { + node = node.parent; + } + if (node is InstanceCreationExpression) { newExpr = node; } return newExpr; diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart index 3861e068c97..bcf880b9b56 100644 --- a/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart +++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart @@ -301,6 +301,52 @@ void f() { ], ); } +'''); + } + + Future test_prefixedConstructor_onConstructor() async { + await resolveTestCode(''' +import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' as m; +void f() { + Center( + child: m./*caret*/Center( + child: Text(''), + ), + ); +} +'''); + await assertHasAssist(''' +import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' as m; +void f() { + Center( + child: Text(''), + ); +} +'''); + } + + Future test_prefixedConstructor_onPrefix() async { + await resolveTestCode(''' +import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' as m; +void f() { + Center( + child: /*caret*/m.Center( + child: Text(''), + ), + ); +} +'''); + await assertHasAssist(''' +import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' as m; +void f() { + Center( + child: Text(''), + ); +} '''); } }