Elements. Use TypeParameterElementImpl in TypeParameterizedElementMixin.

Change-Id: Ic2617976c1099cd89ba73a81eee7c460bec79fd7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/403906
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Phil Quitslund <pquitslund@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 11da360..c681c9e 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -5598,7 +5598,7 @@
   @override
   List<TypeParameterElementImpl2> get typeParameters2 =>
       firstFragment.typeParameters
-          .map((fragment) => (fragment as TypeParameterElementImpl).element)
+          .map((fragment) => fragment.element)
           .toList();
 
   @override
@@ -11035,7 +11035,7 @@
         _ExistingElementImpl,
         TypeParameterizedElement,
         TypeParameterizedFragment {
-  List<TypeParameterElement> _typeParameters = const [];
+  List<TypeParameterElementImpl> _typeParameters = const [];
 
   @override
   List<Fragment> get children3 => children.whereType<Fragment>().toList();
@@ -11049,14 +11049,14 @@
   ElementLinkedData? get linkedData;
 
   @override
-  List<TypeParameterElement> get typeParameters {
+  List<TypeParameterElementImpl> get typeParameters {
     linkedData?.read(this);
     return _typeParameters;
   }
 
-  set typeParameters(List<TypeParameterElement> typeParameters) {
+  set typeParameters(List<TypeParameterElementImpl> typeParameters) {
     for (var typeParameter in typeParameters) {
-      (typeParameter as TypeParameterElementImpl).enclosingElement3 = this;
+      typeParameter.enclosingElement3 = this;
     }
     _typeParameters = typeParameters;
   }
diff --git a/pkg/analyzer/lib/src/dart/element/extensions.dart b/pkg/analyzer/lib/src/dart/element/extensions.dart
index c3a94dd..9f3c044 100644
--- a/pkg/analyzer/lib/src/dart/element/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/element/extensions.dart
@@ -286,3 +286,9 @@
     return null;
   }
 }
+
+extension TypeParameterElementImplExtension on TypeParameterElementImpl {
+  bool get isWildcardVariable {
+    return name == '_' && library.hasWildcardVariablesFeatureEnabled;
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
index 76e0d47..ce205c8 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -1068,7 +1068,7 @@
       result.isSynthetic = true;
       result.parameters = transformedParameters;
       result.returnType = executable.returnType;
-      result.typeParameters = executable.typeParameters;
+      result.typeParameters = executable.typeParameters.cast();
       return result;
     }
 
@@ -1138,7 +1138,7 @@
       var result = MethodElementImpl(firstMethod.name, -1);
       result.enclosingElement3 = targetClass;
       result.name2 = fragmentName;
-      result.typeParameters = resultType.typeFormals;
+      result.typeParameters = resultType.typeFormals.cast();
       result.returnType = resultType.returnType;
       result.parameters = resultType.parameters.toImpl();
       result.element = MethodElementImpl2(
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index 93a7047..b3ec701 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -64,7 +64,7 @@
 
   static ClassElementImpl classElement3({
     required String name,
-    List<TypeParameterElement>? typeParameters,
+    List<TypeParameterElementImpl>? typeParameters,
     List<String> typeParameterNames = const [],
     InterfaceType? supertype,
     List<InterfaceType> mixins = const [],
@@ -246,7 +246,7 @@
 
   static MixinElementImpl mixinElement(
       {required String name,
-      List<TypeParameterElement>? typeParameters,
+      List<TypeParameterElementImpl>? typeParameters,
       List<String> typeParameterNames = const [],
       List<InterfaceType> constraints = const [],
       List<InterfaceType> interfaces = const [],
@@ -352,7 +352,7 @@
     return TypeParameterElementImpl(name, 0);
   }
 
-  static List<TypeParameterElement> typeParameters(List<String> names) {
+  static List<TypeParameterElementImpl> typeParameters(List<String> names) {
     return names.map((name) => typeParameterWithType(name)).toList();
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/variance_builder.dart b/pkg/analyzer/lib/src/summary2/variance_builder.dart
index 810b6e1..0158734 100644
--- a/pkg/analyzer/lib/src/summary2/variance_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/variance_builder.dart
@@ -86,7 +86,7 @@
         if (arguments.isNotEmpty) {
           var parameters = element.typeParameters;
           for (var i = 0; i < arguments.length && i < parameters.length; i++) {
-            var parameter = parameters[i] as TypeParameterElementImpl;
+            var parameter = parameters[i];
             var parameterVariance = parameter.variance;
             result = result.meet(
               parameterVariance.combine(
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
index fe7c916..0fd4bfe 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
@@ -623,7 +623,7 @@
     _coreUnit.encloseElement(objectElement);
     objectElement.interfaces = const <InterfaceType>[];
     objectElement.mixins = const <InterfaceType>[];
-    objectElement.typeParameters = const <TypeParameterElement>[];
+    objectElement.typeParameters = const <TypeParameterElementImpl>[];
     objectElement.constructors = [
       _constructor(isConst: true),
     ];
@@ -974,7 +974,7 @@
   ClassElementImpl _class({
     required String name,
     bool isAbstract = false,
-    List<TypeParameterElement> typeParameters = const [],
+    List<TypeParameterElementImpl> typeParameters = const [],
     required CompilationUnitElementImpl unit,
   }) {
     var element = ClassElementImpl(name, 0);
@@ -1013,7 +1013,7 @@
   FunctionElementImpl _function(
     String name,
     DartType returnType, {
-    List<TypeParameterElement> typeFormals = const [],
+    List<TypeParameterElementImpl> typeFormals = const [],
     List<ParameterElementImpl> parameters = const [],
   }) {
     return FunctionElementImpl(name, 0)
@@ -1070,7 +1070,7 @@
   MethodElementImpl _method(
     String name,
     DartType returnType, {
-    List<TypeParameterElement> typeFormals = const [],
+    List<TypeParameterElementImpl> typeFormals = const [],
     List<ParameterElementImpl> parameters = const [],
   }) {
     return MethodElementImpl(name, 0)
diff --git a/pkg/analyzer/test/generated/elements_types_mixin.dart b/pkg/analyzer/test/generated/elements_types_mixin.dart
index 5ae303b..1a45519 100644
--- a/pkg/analyzer/test/generated/elements_types_mixin.dart
+++ b/pkg/analyzer/test/generated/elements_types_mixin.dart
@@ -123,7 +123,7 @@
     bool isAugmentation = false,
     bool isSealed = false,
     InterfaceType? superType,
-    List<TypeParameterElement> typeParameters = const [],
+    List<TypeParameterElementImpl> typeParameters = const [],
     List<InterfaceType> interfaces = const [],
     List<InterfaceType> mixins = const [],
     List<MethodElementImpl> methods = const [],
@@ -186,7 +186,7 @@
     required DartType extendedType,
     String? name,
     bool isAugmentation = false,
-    List<TypeParameterElement> typeParameters = const [],
+    List<TypeParameterElementImpl> typeParameters = const [],
     List<MethodElementImpl> methods = const [],
   }) {
     var element = ExtensionElementImpl(name, 0);
@@ -203,7 +203,7 @@
     String name, {
     String representationName = 'it',
     required DartType representationType,
-    List<TypeParameterElement> typeParameters = const [],
+    List<TypeParameterElementImpl> typeParameters = const [],
     List<InterfaceType> interfaces = const [],
   }) {
     var fragment = ExtensionTypeElementImpl(name, -1);
@@ -401,7 +401,7 @@
     String name,
     DartType returnType, {
     bool isStatic = false,
-    List<TypeParameterElement> typeFormals = const [],
+    List<TypeParameterElementImpl> typeFormals = const [],
     List<ParameterElementImpl> parameters = const [],
   }) {
     return MethodElementImpl(name, 0)
@@ -414,7 +414,7 @@
   MixinElementImpl mixin_({
     required String name,
     bool isAugmentation = false,
-    List<TypeParameterElement> typeParameters = const [],
+    List<TypeParameterElementImpl> typeParameters = const [],
     List<InterfaceType>? constraints,
     List<InterfaceType> interfaces = const [],
   }) {
@@ -575,7 +575,7 @@
 
   TypeAliasElementImpl typeAlias({
     required String name,
-    required List<TypeParameterElement> typeParameters,
+    required List<TypeParameterElementImpl> typeParameters,
     required DartType aliasedType,
   }) {
     var element = TypeAliasElementImpl(name, 0);