Elements. Migrate ReplacementVisitor.

Change-Id: I06104d34aee22a3355929fc53f99d1cee93ee5c5
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/405606
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 a5ff16d..59d1d66d 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -4637,6 +4637,11 @@
   String get nameShared => wrappedElement.name;
 
   @override
+  ParameterKind get parameterKind {
+    return firstFragment.parameterKind;
+  }
+
+  @override
   // TODO(augmentations): Implement the merge of formal parameters.
   TypeImpl get type => wrappedElement.type;
 
@@ -4665,6 +4670,7 @@
       child.accept2(visitor);
     }
   }
+
   // firstFragment.typeParameters
   //     .map((fragment) => (fragment as TypeParameterElementImpl).element)
   //     .toList();
@@ -4677,6 +4683,8 @@
         FormalParameterElement,
         SharedNamedFunctionParameter,
         VariableElement2OrMember {
+  ParameterKind get parameterKind;
+
   @override
   TypeImpl get type;
 
diff --git a/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart b/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
index 30b102d..a9685b7 100644
--- a/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
@@ -2,9 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// ignore_for_file: analyzer_use_new_elements
-
-import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_visitor.dart';
@@ -18,6 +16,7 @@
 import 'package:analyzer/src/summary2/function_type_builder.dart';
 import 'package:analyzer/src/summary2/named_type_builder.dart';
 import 'package:analyzer/src/summary2/record_type_builder.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 
 /// Helper visitor that clones a type if a nested type is replaced, and
 /// otherwise returns `null`.
@@ -33,8 +32,8 @@
   DartType? createFunctionType({
     required FunctionType type,
     required InstantiatedTypeAliasElement? newAlias,
-    required List<TypeParameterElement>? newTypeParameters,
-    required List<ParameterElement>? newParameters,
+    required List<TypeParameterElement2>? newTypeParameters,
+    required List<FormalParameterElement>? newParameters,
     required DartType? newReturnType,
     required NullabilitySuffix? newNullability,
   }) {
@@ -45,9 +44,9 @@
       return null;
     }
 
-    return FunctionTypeImpl(
-      typeFormals: newTypeParameters ?? type.typeFormals,
-      parameters: newParameters ?? type.parameters,
+    return FunctionTypeImpl.v2(
+      typeParameters: newTypeParameters ?? type.typeParameters,
+      formalParameters: newParameters ?? type.formalParameters,
       returnType: newReturnType ?? type.returnType,
       nullabilitySuffix: newNullability ?? type.nullabilitySuffix,
       alias: newAlias ?? type.alias,
@@ -56,8 +55,8 @@
 
   DartType? createFunctionTypeBuilder({
     required FunctionTypeBuilder type,
-    required List<TypeParameterElement>? newTypeParameters,
-    required List<ParameterElement>? newParameters,
+    required List<TypeParameterElement2>? newTypeParameters,
+    required List<FormalParameterElement>? newParameters,
     required TypeImpl? newReturnType,
     required NullabilitySuffix? newNullability,
   }) {
@@ -67,11 +66,11 @@
       return null;
     }
 
-    return FunctionTypeBuilder(
-      newTypeParameters ?? type.typeFormals,
-      newParameters ?? type.parameters,
-      newReturnType ?? type.returnType,
-      newNullability ?? type.nullabilitySuffix,
+    return FunctionTypeBuilder.v2(
+      typeParameters: newTypeParameters ?? type.typeParameters,
+      formalParameters: newParameters ?? type.formalParameters,
+      returnType: newReturnType ?? type.returnType,
+      nullabilitySuffix: newNullability ?? type.nullabilitySuffix,
     );
   }
 
@@ -104,12 +103,12 @@
       return null;
     }
 
-    return NamedTypeBuilder(
-      type.linker,
-      type.typeSystem,
-      type.element,
-      newTypeArguments ?? type.arguments,
-      newNullability ?? type.nullabilitySuffix,
+    return NamedTypeBuilder.v2(
+      linker: type.linker,
+      typeSystem: type.typeSystem,
+      element: type.element3,
+      arguments: newTypeArguments ?? type.arguments,
+      nullabilitySuffix: newNullability ?? type.nullabilitySuffix,
     );
   }
 
@@ -134,8 +133,8 @@
     }
 
     var promotedBound = (type as TypeParameterTypeImpl).promotedBound;
-    return TypeParameterTypeImpl(
-      element: type.element,
+    return TypeParameterTypeImpl.v2(
+      element: type.element3,
       nullabilitySuffix: newNullability ?? type.nullabilitySuffix,
       promotedBound: newPromotedBound ?? promotedBound,
       alias: type.alias,
@@ -150,8 +149,8 @@
       return null;
     }
 
-    return TypeParameterTypeImpl(
-      element: type.element,
+    return TypeParameterTypeImpl.v2(
+      element: type.element3,
       nullabilitySuffix: newNullability,
       alias: type.alias,
     );
@@ -164,42 +163,42 @@
 
   @override
   DartType? visitFunctionType(FunctionType node) {
+    // TODO(scheglov): avoid this cast
+    node as FunctionTypeImpl;
     var newNullability = visitNullability(node);
 
-    List<TypeParameterElement>? newTypeParameters;
-    for (var i = 0; i < node.typeFormals.length; i++) {
-      var typeParameter = node.typeFormals[i];
+    List<TypeParameterElementImpl2>? newTypeParameters;
+    for (var i = 0; i < node.typeParameters.length; i++) {
+      var typeParameter = node.typeParameters[i];
       var bound = typeParameter.bound;
       if (bound != null) {
         var newBound = visitTypeParameterBound(bound);
         if (newBound != null) {
-          newTypeParameters ??= node.typeFormals.toList(growable: false);
-          newTypeParameters[i] = TypeParameterElementImpl.synthetic(
-            typeParameter.name,
-          )..bound = newBound;
+          newTypeParameters ??= node.typeParameters.toList(growable: false);
+          newTypeParameters[i] = typeParameter.freshCopy()..bound = newBound;
         }
       }
     }
 
     Substitution? substitution;
     if (newTypeParameters != null) {
-      var map = <TypeParameterElement, DartType>{};
+      var map = <TypeParameterElement2, DartType>{};
       for (var i = 0; i < newTypeParameters.length; ++i) {
-        var typeParameter = node.typeFormals[i];
+        var typeParameter = node.typeParameters[i];
         var newTypeParameter = newTypeParameters[i];
         map[typeParameter] = newTypeParameter.instantiate(
           nullabilitySuffix: NullabilitySuffix.none,
         );
       }
 
-      substitution = Substitution.fromMap(map);
+      substitution = Substitution.fromMap2(map);
 
       for (var i = 0; i < newTypeParameters.length; i++) {
         var newTypeParameter = newTypeParameters[i];
         var bound = newTypeParameter.bound;
         if (bound != null) {
           var newBound = substitution.substituteType(bound);
-          (newTypeParameter as TypeParameterElementImpl).bound = newBound;
+          newTypeParameter.bound = newBound;
         }
       }
     }
@@ -228,8 +227,8 @@
         }
       }
       if (newArguments != null) {
-        newAlias = InstantiatedTypeAliasElementImpl(
-          element: alias.element,
+        newAlias = InstantiatedTypeAliasElementImpl.v2(
+          element: alias.element2,
           typeArguments: newArguments,
         );
       }
@@ -237,19 +236,18 @@
 
     changeVariance();
 
-    List<ParameterElement>? newParameters;
-    for (var i = 0; i < node.parameters.length; i++) {
-      var parameter = node.parameters[i];
+    List<FormalParameterElement>? newParameters;
+    for (var i = 0; i < node.formalParameters.length; i++) {
+      var parameter = node.formalParameters[i];
 
       var type = parameter.type;
       var newType = visitType(type);
 
-      // ignore: deprecated_member_use_from_same_package
       var kind = parameter.parameterKind;
       var newKind = visitParameterKind(kind);
 
       if (newType != null || newKind != null) {
-        newParameters ??= node.parameters.toList(growable: false);
+        newParameters ??= node.formalParameters.toList(growable: false);
         newParameters[i] = parameter.copyWith(
           type: newType,
           kind: newKind,
@@ -273,40 +271,38 @@
   DartType? visitFunctionTypeBuilder(FunctionTypeBuilder node) {
     var newNullability = visitNullability(node);
 
-    List<TypeParameterElement>? newTypeParameters;
-    for (var i = 0; i < node.typeFormals.length; i++) {
-      var typeParameter = node.typeFormals[i];
+    List<TypeParameterElementImpl2>? newTypeParameters;
+    for (var i = 0; i < node.typeParameters.length; i++) {
+      var typeParameter = node.typeParameters[i];
       var bound = typeParameter.bound;
       if (bound != null) {
         var newBound = visitTypeParameterBound(bound);
         if (newBound != null) {
-          newTypeParameters ??= node.typeFormals.toList(growable: false);
-          newTypeParameters[i] = TypeParameterElementImpl.synthetic(
-            typeParameter.name,
-          )..bound = newBound;
+          newTypeParameters ??= node.typeParameters.toList(growable: false);
+          newTypeParameters[i] = typeParameter.freshCopy()..bound = newBound;
         }
       }
     }
 
     Substitution? substitution;
     if (newTypeParameters != null) {
-      var map = <TypeParameterElement, DartType>{};
+      var map = <TypeParameterElement2, DartType>{};
       for (var i = 0; i < newTypeParameters.length; ++i) {
-        var typeParameter = node.typeFormals[i];
+        var typeParameter = node.typeParameters[i];
         var newTypeParameter = newTypeParameters[i];
         map[typeParameter] = newTypeParameter.instantiate(
           nullabilitySuffix: NullabilitySuffix.none,
         );
       }
 
-      substitution = Substitution.fromMap(map);
+      substitution = Substitution.fromMap2(map);
 
       for (var i = 0; i < newTypeParameters.length; i++) {
         var newTypeParameter = newTypeParameters[i];
         var bound = newTypeParameter.bound;
         if (bound != null) {
           var newBound = substitution.substituteType(bound);
-          (newTypeParameter as TypeParameterElementImpl).bound = newBound;
+          newTypeParameter.bound = newBound;
         }
       }
     }
@@ -326,9 +322,9 @@
 
     changeVariance();
 
-    List<ParameterElement>? newParameters;
-    for (var i = 0; i < node.parameters.length; i++) {
-      var parameter = node.parameters[i];
+    List<FormalParameterElement>? newParameters;
+    for (var i = 0; i < node.formalParameters.length; i++) {
+      var parameter = node.formalParameters[i];
 
       var type = parameter.type;
       var newType = visitType(type);
@@ -338,7 +334,7 @@
       var newKind = visitParameterKind(kind);
 
       if (newType != null || newKind != null) {
-        newParameters ??= node.parameters.toList(growable: false);
+        newParameters ??= node.formalParameters.toList(growable: false);
         newParameters[i] = parameter.copyWith(
           type: newType,
           kind: newKind,
@@ -365,19 +361,19 @@
     var alias = type.alias;
     if (alias != null) {
       var newArguments = _typeArguments(
-        alias.element.typeParameters,
+        alias.element2.typeParameters2,
         alias.typeArguments,
       );
       if (newArguments != null) {
-        newAlias = InstantiatedTypeAliasElementImpl(
-          element: alias.element,
+        newAlias = InstantiatedTypeAliasElementImpl.v2(
+          element: alias.element2,
           typeArguments: newArguments,
         );
       }
     }
 
     var newTypeArguments = _typeArguments(
-      type.element.typeParameters,
+      type.element3.typeParameters2,
       type.typeArguments,
     );
 
@@ -398,12 +394,12 @@
   DartType? visitNamedTypeBuilder(NamedTypeBuilder type) {
     var newNullability = visitNullability(type);
 
-    var parameters = const <TypeParameterElement>[];
-    var element = type.element;
-    if (element is InterfaceElement) {
-      parameters = element.typeParameters;
-    } else if (element is TypeAliasElement) {
-      parameters = element.typeParameters;
+    var parameters = const <TypeParameterElement2>[];
+    var element = type.element3;
+    if (element is InterfaceElement2) {
+      parameters = element.typeParameters2;
+    } else if (element is TypeAliasElement2) {
+      parameters = element.typeParameters2;
     }
 
     var newArguments = _typeArguments(parameters, type.arguments);
@@ -440,12 +436,12 @@
     var alias = type.alias;
     if (alias != null) {
       var newArguments = _typeArguments(
-        alias.element.typeParameters,
+        alias.element2.typeParameters2,
         alias.typeArguments,
       );
       if (newArguments != null) {
-        newAlias = InstantiatedTypeAliasElementImpl(
-          element: alias.element,
+        newAlias = InstantiatedTypeAliasElementImpl.v2(
+          element: alias.element2,
           typeArguments: newArguments,
         );
       }
@@ -521,7 +517,7 @@
   }
 
   DartType? visitTypeArgument(
-    TypeParameterElement parameter,
+    TypeParameterElement2 parameter,
     DartType argument,
   ) {
     return argument.accept(this);
@@ -533,9 +529,11 @@
 
   @override
   DartType? visitTypeParameterType(TypeParameterType type) {
+    // TODO(scheglov): avoid this cast
+    type as TypeParameterTypeImpl;
     var newNullability = visitNullability(type);
 
-    var promotedBound = (type as TypeParameterTypeImpl).promotedBound;
+    var promotedBound = type.promotedBound;
     if (promotedBound != null) {
       var newPromotedBound = promotedBound.accept(this);
       return createPromotedTypeParameterType(
@@ -562,7 +560,7 @@
   }
 
   List<DartType>? _typeArguments(
-    List<TypeParameterElement> parameters,
+    List<TypeParameterElement2> parameters,
     List<DartType> arguments,
   ) {
     if (arguments.length != parameters.length) {
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 6f57fcd..ae41a02 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -561,6 +561,16 @@
     required this.typeArguments,
   });
 
+  factory InstantiatedTypeAliasElementImpl.v2({
+    required TypeAliasElement2 element,
+    required List<DartType> typeArguments,
+  }) {
+    return InstantiatedTypeAliasElementImpl(
+      element: element.asElement,
+      typeArguments: typeArguments,
+    );
+  }
+
   @override
   TypeAliasElement2 get element2 => (element as TypeAliasFragment).element;
 }
diff --git a/pkg/analyzer/lib/src/summary2/default_types_builder.dart b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
index f114947..906f815 100644
--- a/pkg/analyzer/lib/src/summary2/default_types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
@@ -6,6 +6,7 @@
 
 import 'package:_fe_analyzer_shared/src/type_inference/type_analyzer_operations.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
@@ -447,13 +448,13 @@
 
   @override
   DartType? visitTypeArgument(
-    TypeParameterElement parameter,
+    TypeParameterElement2 parameter,
     DartType argument,
   ) {
     var savedVariance = _variance;
     try {
       _variance = _variance.combine(
-        (parameter as TypeParameterElementImpl).variance,
+        (parameter as TypeParameterElementImpl2).variance,
       );
       return super.visitTypeArgument(parameter, argument);
     } finally {
diff --git a/pkg/analyzer/lib/src/summary2/function_type_builder.dart b/pkg/analyzer/lib/src/summary2/function_type_builder.dart
index 91888f5..6022817 100644
--- a/pkg/analyzer/lib/src/summary2/function_type_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/function_type_builder.dart
@@ -5,6 +5,7 @@
 // ignore_for_file: analyzer_use_new_elements
 
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_visitor.dart';
@@ -16,6 +17,7 @@
 import 'package:analyzer/src/dart/element/type_visitor.dart';
 import 'package:analyzer/src/summary2/type_builder.dart';
 import 'package:analyzer/src/utilities/extensions/collection.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 
 /// The type builder for a [GenericFunctionType].
 class FunctionTypeBuilder extends TypeBuilder {
@@ -60,6 +62,30 @@
     );
   }
 
+  factory FunctionTypeBuilder.v2({
+    required List<TypeParameterElement2> typeParameters,
+    required List<FormalParameterElement> formalParameters,
+    required TypeImpl returnType,
+    required NullabilitySuffix nullabilitySuffix,
+    GenericFunctionTypeImpl? node,
+  }) {
+    return FunctionTypeBuilder(
+      typeParameters.map((e) => e.asElement).toList(),
+      formalParameters.map((e) => e.asElement).toList(),
+      returnType,
+      nullabilitySuffix,
+      node: node,
+    );
+  }
+
+  List<FormalParameterElementMixin> get formalParameters {
+    return parameters.map((p) => p.asElement2).toList(growable: false);
+  }
+
+  List<TypeParameterElementImpl2> get typeParameters => typeFormals
+      .map((fragment) => fragment.asElement2 as TypeParameterElementImpl2)
+      .toList();
+
   @override
   R accept<R>(TypeVisitor<R> visitor) {
     if (visitor is LinkingTypeVisitor<R>) {
diff --git a/pkg/analyzer/lib/src/summary2/named_type_builder.dart b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
index c1724c6..7ddffc1 100644
--- a/pkg/analyzer/lib/src/summary2/named_type_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
@@ -6,6 +6,7 @@
 
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_visitor.dart';
@@ -18,6 +19,7 @@
 import 'package:analyzer/src/summary2/link.dart';
 import 'package:analyzer/src/summary2/type_builder.dart';
 import 'package:analyzer/src/utilities/extensions/collection.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 
 /// The type builder for a [NamedType].
 class NamedTypeBuilder extends TypeBuilder {
@@ -72,6 +74,29 @@
         node: node);
   }
 
+  factory NamedTypeBuilder.v2({
+    required Linker linker,
+    required TypeSystemImpl typeSystem,
+    required Element2 element,
+    required List<DartType> arguments,
+    required NullabilitySuffix nullabilitySuffix,
+    NamedTypeImpl? node,
+  }) {
+    return NamedTypeBuilder(
+      linker,
+      typeSystem,
+      element.asElement!,
+      arguments,
+      nullabilitySuffix,
+      node: node,
+    );
+  }
+
+  @override
+  Element2 get element3 {
+    return element.asElement2!;
+  }
+
   // TODO(scheglov): Only when enabled both in the element, and target?
   bool get _isNonFunctionTypeAliasesEnabled {
     return element.library!.featureSet.isEnabled(