Elements. Use FormalParameterElementMixin in impl elements, remove a few TypeImpl casts.

Change-Id: I4001175016b92b07a294e3e6f8461a3727b6d1d0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/412141
Reviewed-by: Paul Berry <paulberry@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 4e98569..0b62dc4 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1647,11 +1647,11 @@
 
 class ConstructorElementImpl2 extends ExecutableElementImpl2
     with
-        FragmentedExecutableElementMixin<ConstructorFragment>,
-        FragmentedFunctionTypedElementMixin<ConstructorFragment>,
-        FragmentedTypeParameterizedElementMixin<ConstructorFragment>,
-        FragmentedAnnotatableElementMixin<ConstructorFragment>,
-        FragmentedElementMixin<ConstructorFragment>,
+        FragmentedExecutableElementMixin<ConstructorElementImpl>,
+        FragmentedFunctionTypedElementMixin<ConstructorElementImpl>,
+        FragmentedTypeParameterizedElementMixin<ConstructorElementImpl>,
+        FragmentedAnnotatableElementMixin<ConstructorElementImpl>,
+        FragmentedElementMixin<ConstructorElementImpl>,
         ConstructorElementMixin2,
         _HasSinceSdkVersionMixin
     implements ConstructorElement2 {
@@ -3770,6 +3770,9 @@
 /// `ExecutableElement2`.
 abstract class ExecutableElement2OrMember implements ExecutableElement2 {
   @override
+  List<FormalParameterElementMixin> get formalParameters;
+
+  @override
   TypeImpl get returnType;
 
   @override
@@ -5189,11 +5192,11 @@
   }
 }
 
-mixin FragmentedExecutableElementMixin<E extends ExecutableFragment>
+mixin FragmentedExecutableElementMixin<E extends ExecutableElementImpl>
     implements FragmentedElementMixin<E> {
-  List<FormalParameterElement> get formalParameters {
+  List<FormalParameterElementMixin> get formalParameters {
     return firstFragment.formalParameters
-        .map((fragment) => fragment.element)
+        .map((fragment) => fragment.asElement2)
         .toList();
   }
 
@@ -5235,15 +5238,13 @@
   // TODO(augmentations): This might be wrong. The parameters need to be a
   //  merge of the parameters of all of the fragments, but this probably doesn't
   //  account for missing data (such as the parameter types).
-  List<FormalParameterElement> get formalParameters {
+  List<FormalParameterElementMixin> get formalParameters {
     var fragment = firstFragment;
     return switch (fragment) {
-      FunctionTypedElementImpl(:var parameters) => parameters
-          .map((fragment) => (fragment as FormalParameterFragment).element)
-          .toList(),
-      ExecutableElementImpl(:var parameters) => parameters
-          .map((fragment) => (fragment as FormalParameterFragment).element)
-          .toList(),
+      FunctionTypedElementImpl(:var parameters) =>
+        parameters.map((fragment) => fragment.asElement2).toList(),
+      ExecutableElementImpl(:var parameters) =>
+        parameters.map((fragment) => fragment.asElement2).toList(),
       _ => throw UnsupportedError(
           'Cannot get formal parameters for ${fragment.runtimeType}'),
     };
@@ -5451,8 +5452,7 @@
   Fragment? get enclosingFragment => enclosingElement3 as Fragment;
 
   @override
-  List<FormalParameterFragment> get formalParameters =>
-      parameters.cast<FormalParameterFragment>();
+  List<ParameterElementImpl> get formalParameters => parameters;
 
   @override
   String get identifier => '-';
@@ -5607,11 +5607,11 @@
 
 class GetterElementImpl extends PropertyAccessorElementImpl2
     with
-        FragmentedExecutableElementMixin<GetterFragment>,
-        FragmentedFunctionTypedElementMixin<GetterFragment>,
-        FragmentedTypeParameterizedElementMixin<GetterFragment>,
-        FragmentedAnnotatableElementMixin<GetterFragment>,
-        FragmentedElementMixin<GetterFragment>,
+        FragmentedExecutableElementMixin<PropertyAccessorElementImpl>,
+        FragmentedFunctionTypedElementMixin<PropertyAccessorElementImpl>,
+        FragmentedTypeParameterizedElementMixin<PropertyAccessorElementImpl>,
+        FragmentedAnnotatableElementMixin<PropertyAccessorElementImpl>,
+        FragmentedElementMixin<PropertyAccessorElementImpl>,
         _HasSinceSdkVersionMixin
     implements GetterElement2OrMember {
   @override
@@ -7879,7 +7879,7 @@
   FunctionElementImpl get firstFragment => _wrappedElement;
 
   @override
-  List<FormalParameterElement> get formalParameters =>
+  List<FormalParameterElementMixin> get formalParameters =>
       _wrappedElement.formalParameters
           .map((fragment) => fragment.element)
           .toList();
@@ -8550,11 +8550,11 @@
 
 class MethodElementImpl2 extends ExecutableElementImpl2
     with
-        FragmentedExecutableElementMixin<MethodFragment>,
-        FragmentedFunctionTypedElementMixin<MethodFragment>,
-        FragmentedTypeParameterizedElementMixin<MethodFragment>,
-        FragmentedAnnotatableElementMixin<MethodFragment>,
-        FragmentedElementMixin<MethodFragment>,
+        FragmentedExecutableElementMixin<MethodElementImpl>,
+        FragmentedFunctionTypedElementMixin<MethodElementImpl>,
+        FragmentedTypeParameterizedElementMixin<MethodElementImpl>,
+        FragmentedAnnotatableElementMixin<MethodElementImpl>,
+        FragmentedElementMixin<MethodElementImpl>,
         _HasSinceSdkVersionMixin
     implements MethodElement2OrMember {
   @override
@@ -10703,11 +10703,11 @@
 
 class SetterElementImpl extends PropertyAccessorElementImpl2
     with
-        FragmentedExecutableElementMixin<SetterFragment>,
-        FragmentedFunctionTypedElementMixin<SetterFragment>,
-        FragmentedTypeParameterizedElementMixin<SetterFragment>,
-        FragmentedAnnotatableElementMixin<SetterFragment>,
-        FragmentedElementMixin<SetterFragment>,
+        FragmentedExecutableElementMixin<PropertyAccessorElementImpl>,
+        FragmentedFunctionTypedElementMixin<PropertyAccessorElementImpl>,
+        FragmentedTypeParameterizedElementMixin<PropertyAccessorElementImpl>,
+        FragmentedAnnotatableElementMixin<PropertyAccessorElementImpl>,
+        FragmentedElementMixin<PropertyAccessorElementImpl>,
         _HasSinceSdkVersionMixin
     implements SetterElement2OrMember {
   @override
@@ -10909,11 +10909,11 @@
 
 class TopLevelFunctionElementImpl extends ExecutableElementImpl2
     with
-        FragmentedExecutableElementMixin<TopLevelFunctionFragment>,
-        FragmentedFunctionTypedElementMixin<TopLevelFunctionFragment>,
-        FragmentedTypeParameterizedElementMixin<TopLevelFunctionFragment>,
-        FragmentedAnnotatableElementMixin<TopLevelFunctionFragment>,
-        FragmentedElementMixin<TopLevelFunctionFragment>,
+        FragmentedExecutableElementMixin<FunctionElementImpl>,
+        FragmentedFunctionTypedElementMixin<FunctionElementImpl>,
+        FragmentedTypeParameterizedElementMixin<FunctionElementImpl>,
+        FragmentedAnnotatableElementMixin<FunctionElementImpl>,
+        FragmentedElementMixin<FunctionElementImpl>,
         _HasSinceSdkVersionMixin
     implements TopLevelFunctionElement {
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/extensions.dart b/pkg/analyzer/lib/src/dart/element/extensions.dart
index c1c8cc6..c631ebc 100644
--- a/pkg/analyzer/lib/src/dart/element/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/element/extensions.dart
@@ -202,9 +202,7 @@
   TypeImpl? get firstParameterType {
     var self = this;
     if (self is MethodElement2OrMember) {
-      // TODO(paulberry): eliminate this cast by changing this extension to
-      // apply to `ExecutableElementOrMember?`.
-      return self.formalParameters.firstOrNull?.type as TypeImpl?;
+      return self.formalParameters.firstOrNull?.type;
     }
     return null;
   }
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 7f24cce..af764a2 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -265,7 +265,7 @@
   Element2? get enclosingElement2 => _element2.enclosingElement2;
 
   @override
-  List<FormalParameterElement> get formalParameters =>
+  List<FormalParameterElementMixin> get formalParameters =>
       parameters.map((fragment) => fragment.asElement2).toList();
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
index 6b6be1f..30f5561 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -197,13 +197,7 @@
           var parameters = method.formalParameters;
           if (parameters.isNotEmpty) {
             return _typeSystem.refineNumericInvocationContext2(
-                leftType,
-                method,
-                leftType,
-                // TODO(paulberry): eliminate this cast by changing the type of
-                // `MethodElementOrMember.parameters` to
-                // `List<ParameterElementMixin>`.
-                parameters[0].type as TypeImpl);
+                leftType, method, leftType, parameters[0].type);
           }
         }
         return UnknownInferredType.instance;
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 4f8c1ff..c5609c4 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1713,20 +1713,14 @@
     if (node is AugmentedExpression) {
       if (element is SetterElement2OrMember) {
         if (element.formalParameters case [var valueParameter]) {
-          // TODO(paulberry): eliminate this cast by changing the type of
-          // `PropertyAccessorElementOrMember.parameters` to
-          // `List<ParameterElementMixin>`.
-          writeType = valueParameter.type as TypeImpl;
+          writeType = valueParameter.type;
         }
       }
     } else if (node is IndexExpression) {
-      if (element is MethodElement2) {
+      if (element is MethodElement2OrMember) {
         var parameters = element.formalParameters;
         if (parameters.length == 2) {
-          // TODO(paulberry): eliminate this cast by changing the type of
-          // `PropertyAccessorElementOrMember.parameters` to
-          // `List<ParameterElementMixin>`.
-          writeType = parameters[1].type as TypeImpl;
+          writeType = parameters[1].type;
         }
       }
     } else if (node is PrefixedIdentifier ||
@@ -1741,10 +1735,7 @@
         } else {
           var parameters = element.formalParameters;
           if (parameters.length == 1) {
-            // TODO(paulberry): eliminate this cast by changing the type of
-            // `PropertyAccessorElementOrMember.parameters` to
-            // `List<ParameterElementMixin>`.
-            writeType = parameters[0].type as TypeImpl;
+            writeType = parameters[0].type;
           }
         }
       } else if (element is VariableElement2OrMember) {