Resynthesize DefaultFieldFormalParameterElementImpl.

R=brianwilkerson@google.com

Change-Id: I7b59a8c8df8812acc6a620ef57cfd2b5c8e24e92
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/97681
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index d5b5c03..766ca7b 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -2794,6 +2794,10 @@
   DefaultFieldFormalParameterElementImpl(String name, int nameOffset)
       : super(name, nameOffset);
 
+  DefaultFieldFormalParameterElementImpl.forLinkedNode(
+      ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+      : super.forLinkedNode(enclosing, reference, linkedNode);
+
   /// Initialize a newly created parameter element to have the given [name].
   DefaultFieldFormalParameterElementImpl.forNode(Identifier name)
       : super.forNode(name);
@@ -4883,9 +4887,9 @@
   @override
   DartType get type {
     if (linkedNode != null) {
-      return _type ??= enclosingUnit.linkedContext.getType(
-        linkedNode.fieldFormalParameter_type2,
-      );
+      if (_type != null) return _type;
+      var context = enclosingUnit.linkedContext;
+      return _type = context.getFormalParameterType(linkedNode);
     }
     if (unlinkedParam != null &&
         unlinkedParam.type == null &&
@@ -7894,14 +7898,7 @@
   @override
   bool get isFinal {
     if (linkedNode != null) {
-      if (linkedNode.kind == LinkedNodeKind.defaultFormalParameter) {
-        var parameter = linkedNode.defaultFormalParameter_parameter;
-        return parameter.simpleFormalParameter_keyword != 0;
-      }
-      if (linkedNode.kind == LinkedNodeKind.fieldFormalParameter) {
-        return false;
-      }
-      return linkedNode.simpleFormalParameter_keyword != 0;
+      return enclosingUnit.linkedContext.isFinal(linkedNode);
     }
     if (unlinkedParam != null) {
       return unlinkedParam.isFinal;
@@ -8014,15 +8011,8 @@
   DartType get type {
     if (linkedNode != null) {
       if (_type != null) return _type;
-      if (linkedNode.kind == LinkedNodeKind.defaultFormalParameter) {
-        var parameter = linkedNode.defaultFormalParameter_parameter;
-        return _type = enclosingUnit.linkedContext.getType(
-          parameter.simpleFormalParameter_type2,
-        );
-      }
-      return _type = enclosingUnit.linkedContext.getType(
-        linkedNode.simpleFormalParameter_type2,
-      );
+      var context = enclosingUnit.linkedContext;
+      return _type = context.getFormalParameterType(linkedNode);
     }
     _resynthesizeTypeAndParameters();
     return super.type;
@@ -8147,11 +8137,19 @@
         var name = context.getFormalParameterName(parameterNode);
         var reference = containerRef.getChild(name);
         reference.node = node;
-        return DefaultParameterElementImpl.forLinkedNode(
-          enclosing,
-          reference,
-          node,
-        );
+        if (parameterNode.kind == LinkedNodeKind.fieldFormalParameter) {
+          return DefaultFieldFormalParameterElementImpl.forLinkedNode(
+            enclosing,
+            reference,
+            node,
+          );
+        } else {
+          return DefaultParameterElementImpl.forLinkedNode(
+            enclosing,
+            reference,
+            node,
+          );
+        }
       } else {
         var name = context.getFormalParameterName(node);
         var reference = containerRef.getChild(name);
diff --git a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
index 1d50b06..7e2cdb7 100644
--- a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
@@ -212,6 +212,12 @@
 
   bool isConst(LinkedNode node) {
     var kind = node.kind;
+    if (kind == LinkedNodeKind.defaultFormalParameter) {
+      return isConst(node.defaultFormalParameter_parameter);
+    }
+    if (kind == LinkedNodeKind.simpleFormalParameter) {
+      return isConstKeyword(node.simpleFormalParameter_keyword);
+    }
     if (kind == LinkedNodeKind.variableDeclaration) {
       return node.variableDeclaration_declaration.isConst;
     }
@@ -239,11 +245,34 @@
     }
   }
 
+  DartType getFormalParameterType(LinkedNode node) {
+    var kind = node.kind;
+    if (kind == LinkedNodeKind.defaultFormalParameter) {
+      return getFormalParameterType(node.defaultFormalParameter_parameter);
+    }
+    if (kind == LinkedNodeKind.fieldFormalParameter) {
+      return getType(node.fieldFormalParameter_type2);
+    }
+    if (kind == LinkedNodeKind.simpleFormalParameter) {
+      return getType(node.simpleFormalParameter_type2);
+    }
+    throw UnimplementedError('$kind');
+  }
+
   bool isFinal(LinkedNode node) {
     var kind = node.kind;
+    if (kind == LinkedNodeKind.defaultFormalParameter) {
+      return isFinal(node.defaultFormalParameter_parameter);
+    }
     if (kind == LinkedNodeKind.enumConstantDeclaration) {
       return false;
     }
+    if (kind == LinkedNodeKind.fieldFormalParameter) {
+      return isFinalKeyword(node.fieldFormalParameter_keyword);
+    }
+    if (kind == LinkedNodeKind.simpleFormalParameter) {
+      return isFinalKeyword(node.simpleFormalParameter_keyword);
+    }
     if (kind == LinkedNodeKind.variableDeclaration) {
       return node.variableDeclaration_declaration.isFinal;
     }
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index 8f16bbd..5d7f97a 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -48,13 +48,16 @@
         if (type == null) {
           throw StateError('Field $name should have a type.');
         }
-        fields[name] = type;
+        fields[name] ??= type;
       });
 
       for (var member in members) {
         if (member.kind == LinkedNodeKind.constructorDeclaration) {
           for (var parameter in member.constructorDeclaration_parameters
               .formalParameterList_parameters) {
+            if (parameter.kind == LinkedNodeKind.defaultFormalParameter) {
+              parameter = parameter.defaultFormalParameter_parameter;
+            }
             if (parameter.kind == LinkedNodeKind.fieldFormalParameter &&
                 parameter.fieldFormalParameter_type2 == null) {
               var name = unit.context.getSimpleName(
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
index a5fa356..6a7e658 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
@@ -189,12 +189,6 @@
 
   @override
   @failingTest
-  test_class_alias_with_forwarding_constructors() async {
-    await super.test_class_alias_with_forwarding_constructors();
-  }
-
-  @override
-  @failingTest
   test_class_alias_with_forwarding_constructors_type_substitution() async {
     await super
         .test_class_alias_with_forwarding_constructors_type_substitution();
@@ -202,13 +196,6 @@
 
   @override
   @failingTest
-  test_class_alias_with_forwarding_constructors_type_substitution_complex() async {
-    await super
-        .test_class_alias_with_forwarding_constructors_type_substitution_complex();
-  }
-
-  @override
-  @failingTest
   test_class_constructor_field_formal_functionTyped_noReturnType() async {
     await super
         .test_class_constructor_field_formal_functionTyped_noReturnType();
@@ -223,36 +210,6 @@
 
   @override
   @failingTest
-  test_class_constructor_field_formal_multiple_matching_fields() async {
-    await super.test_class_constructor_field_formal_multiple_matching_fields();
-  }
-
-  @override
-  @failingTest
-  test_class_constructor_fieldFormal_named_noDefault() async {
-    await super.test_class_constructor_fieldFormal_named_noDefault();
-  }
-
-  @override
-  @failingTest
-  test_class_constructor_fieldFormal_named_withDefault() async {
-    await super.test_class_constructor_fieldFormal_named_withDefault();
-  }
-
-  @override
-  @failingTest
-  test_class_constructor_fieldFormal_optional_noDefault() async {
-    await super.test_class_constructor_fieldFormal_optional_noDefault();
-  }
-
-  @override
-  @failingTest
-  test_class_constructor_fieldFormal_optional_withDefault() async {
-    await super.test_class_constructor_fieldFormal_optional_withDefault();
-  }
-
-  @override
-  @failingTest
   test_class_type_parameters_f_bound_complex() async {
     await super.test_class_type_parameters_f_bound_complex();
   }
@@ -454,19 +411,6 @@
 
   @override
   @failingTest
-  test_const_parameterDefaultValue_initializingFormal_named() async {
-    await super.test_const_parameterDefaultValue_initializingFormal_named();
-  }
-
-  @override
-  @failingTest
-  test_const_parameterDefaultValue_initializingFormal_positional() async {
-    await super
-        .test_const_parameterDefaultValue_initializingFormal_positional();
-  }
-
-  @override
-  @failingTest
   test_const_reference_staticField_imported_withPrefix() async {
     await super.test_const_reference_staticField_imported_withPrefix();
   }
@@ -1373,12 +1317,6 @@
 
   @override
   @failingTest
-  test_parameterTypeNotInferred_initializingFormal() async {
-    await super.test_parameterTypeNotInferred_initializingFormal();
-  }
-
-  @override
-  @failingTest
   test_parts() async {
     await super.test_parts();
   }