[DAS] Makes convert into field assist consider extensions correctly
R=helinx@google.com
Fixes: https://github.com/dart-lang/sdk/issues/60060
Change-Id: I596a473a293fee83f8eb0de0cc30a90aeef1ff51
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/412501
Commit-Queue: Phil Quitslund <pquitslund@google.com>
Auto-Submit: Felipe Morschel <git@fmorschel.dev>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Reviewed-by: Samuel Rawlins <srawlins@google.com>
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_final_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_final_field.dart
index 532058f..72666e4 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_final_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_final_field.dart
@@ -17,9 +17,8 @@
@override
CorrectionApplicability get applicability =>
- // TODO(applicability): comment on why.
- CorrectionApplicability
- .singleLocation;
+ // TODO(applicability): comment on why.
+ CorrectionApplicability.singleLocation;
@override
AssistKind get assistKind => DartAssistKind.CONVERT_INTO_FINAL_FIELD;
@@ -54,6 +53,15 @@
return;
}
+ // The getter must not be in an extension or extension type unless it is
+ // static.
+ if (!getterElement.isStatic) {
+ switch (getterElement.enclosingElement2) {
+ case ExtensionElement2() || ExtensionTypeElement2():
+ return;
+ }
+ }
+
var variable = getterElement.variable3;
if (variable == null) {
return;
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_final_field_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_final_field_test.dart
index c80b319..bb94ead 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_into_final_field_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_final_field_test.dart
@@ -34,6 +34,50 @@
''');
}
+ Future<void> test_extension_instance() async {
+ await resolveTestCode('''
+extension E on int {
+ int get foo => 0;
+}
+''');
+ await assertNoAssistAt('get foo');
+ }
+
+ Future<void> test_extension_static() async {
+ await resolveTestCode('''
+extension E on int {
+ static int get foo => 0;
+}
+''');
+ await assertHasAssistAt('get foo', '''
+extension E on int {
+ static final int foo = 0;
+}
+''');
+ }
+
+ Future<void> test_extensionType_instance() async {
+ await resolveTestCode('''
+extension type E(int v) {
+ int get foo => 0;
+}
+''');
+ await assertNoAssistAt('get foo');
+ }
+
+ Future<void> test_extensionType_static() async {
+ await resolveTestCode('''
+extension type E(int v) {
+ static int get foo => 0;
+}
+''');
+ await assertHasAssistAt('get foo', '''
+extension type E(int v) {
+ static final int foo = 0;
+}
+''');
+ }
+
Future<void> test_hasOverride() async {
await resolveTestCode('''
const myAnnotation = const Object();