Issue 56558. Fixed encapsulate_field to work with dynamic and prefixed types.

Bug: https://github.com/dart-lang/sdk/issues/56558
Change-Id: I59cce649a2f7989804e4dfd580cf2041c89fbe3a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/385322
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart
index eb9c827..468319c 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/encapsulate_field.dart
@@ -88,11 +88,19 @@
       // rename field
       builder.addSimpleReplacement(range.token(nameToken), '_$name');
 
+      String fieldTypeCode;
+      var type = fieldDeclaration.fields.type;
+      if (type == null) {
+        fieldTypeCode = '';
+      } else {
+        fieldTypeCode = utils.getNodeText(type);
+      }
       _updateReferencesInConstructors(
         builder,
         classMembers,
         fieldElement,
         name,
+        fieldTypeCode,
       );
 
       // Write getter and setter.
@@ -155,6 +163,7 @@
     ConstructorDeclaration constructor,
     FieldElement2 fieldElement,
     String name,
+    String fieldTypeCode,
   ) {
     for (var parameter in constructor.parameters.parameters) {
       var identifier = parameter.name;
@@ -166,9 +175,10 @@
           var normalParam = parameter.parameter;
           if (normalParam is FieldFormalParameter) {
             var start = normalParam.thisKeyword;
-            var type = parameterElement.type.getDisplayString();
             builder.addSimpleReplacement(
-                range.startEnd(start, normalParam.period), '$type ');
+              range.startEnd(start, normalParam.period),
+              fieldTypeCode.isNotEmpty ? '$fieldTypeCode ' : '',
+            );
 
             var previous = constructor.separator ?? constructor.parameters;
             var replacement = constructor.initializers.isEmpty
@@ -197,6 +207,7 @@
     List<ClassMember> classMembers,
     FieldElement2 fieldElement,
     String name,
+    String fieldTypeCode,
   ) {
     for (var constructor in classMembers) {
       if (constructor is ConstructorDeclaration) {
@@ -205,6 +216,7 @@
           constructor,
           fieldElement,
           name,
+          fieldTypeCode,
         );
       }
     }
diff --git a/pkg/analysis_server/test/src/services/correction/assist/encapsulate_field_test.dart b/pkg/analysis_server/test/src/services/correction/assist/encapsulate_field_test.dart
index 76678e1..b4a4321 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/encapsulate_field_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/encapsulate_field_test.dart
@@ -403,6 +403,56 @@
 ''');
   }
 
+  Future<void> test_named_formalParameter_noType() async {
+    await resolveTestCode('''
+class C {
+  var foo;
+
+  C({required this.foo});
+}
+''');
+    await assertHasAssistAt('foo;', '''
+class C {
+  var _foo;
+
+  get foo => _foo;
+
+  set foo(value) {
+    _foo = value;
+  }
+
+  C({required foo}) : _foo = foo;
+}
+''');
+  }
+
+  Future<void> test_named_formalParameter_prefixedType() async {
+    await resolveTestCode('''
+import 'dart:math' as math;
+
+class C {
+  math.Random foo;
+
+  C({required this.foo});
+}
+''');
+    await assertHasAssistAt('foo;', '''
+import 'dart:math' as math;
+
+class C {
+  math.Random _foo;
+
+  math.Random get foo => _foo;
+
+  set foo(math.Random value) {
+    _foo = value;
+  }
+
+  C({required math.Random foo}) : _foo = foo;
+}
+''');
+  }
+
   Future<void> test_named_super_initializer() async {
     await resolveTestCode('''
 class A {}