[analyzer] Use PromotableElementImpl2 to interface to shared analysis code.

Change the analyzer's use of shared classes and mixins to to supply
`PromotableElementImpl2` instead of `PromotableElement2` as the type
parameter that represents promotable variables.

This is a follow-up to
https://dart-review.googlesource.com/c/sdk/+/400660, which changed the
code from supplying `PromotableElement` to `PromotableElement2`. That
change was both larger and riskier than this one, since it changed the
identity of the objects that were passed to shared analysis code. This
change merely substitutes a more precise type for the type argument,
without changing the underlying objects in use.

This is part of a larger arc of work to change the analyzer's use of
the shared code so that the type parameters it supplies are not part
of the analyzer public API. See
https://github.com/dart-lang/sdk/issues/59763.

Change-Id: I2013dd0b7d38350ed7a9f2f4bd875d0006941754
Bug: https://github.com/dart-lang/sdk/issues/59763
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/401740
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 6747887..7898075 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -821,7 +821,7 @@
   @override
   DartType computePatternSchema(ResolverVisitor resolverVisitor) {
     var element = element2;
-    if (element is PromotableElement2) {
+    if (element is PromotableElementImpl2) {
       return resolverVisitor
           .analyzeAssignedVariablePatternSchema(element)
           .unwrapTypeSchemaView();
@@ -2583,7 +2583,7 @@
 
   @experimental
   @override
-  LocalVariableElement2? get declaredElement2 {
+  LocalVariableElementImpl2? get declaredElement2 {
     return declaredElement.asElement2 as LocalVariableElementImpl2?;
   }
 
@@ -4892,7 +4892,7 @@
 
   @experimental
   @override
-  LocalVariableElement2? get declaredElement2 {
+  LocalVariableElementImpl2? get declaredElement2 {
     return declaredElement.asElement2 as LocalVariableElementImpl2?;
   }
 
@@ -4983,7 +4983,7 @@
 
   @experimental
   @override
-  BindPatternVariableElement2? get declaredElement2 {
+  BindPatternVariableElementImpl2? get declaredElement2 {
     return declaredElement?.element;
   }
 
@@ -17274,7 +17274,7 @@
   final bool hasLabels;
 
   /// Joined variables declared in [members], available in [statements].
-  late Map<String, PromotableElement2> variables;
+  late Map<String, PromotableElementImpl2> variables;
 
   SwitchStatementCaseGroup(this.members, this.hasLabels);
 
diff --git a/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart b/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart
index 9890913..a5fc6ba 100644
--- a/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart
@@ -21,7 +21,6 @@
         UnknownTypeConstraintOrigin;
 import 'package:_fe_analyzer_shared/src/types/shared_type.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/element/element.dart';
@@ -31,19 +30,27 @@
 
 /// Instance of [shared.GeneratedTypeConstraint] specific to the Analyzer.
 typedef GeneratedTypeConstraint = shared.GeneratedTypeConstraint<DartType,
-    TypeParameterElement, PromotableElement2>;
+    TypeParameterElement, PromotableElementImpl2>;
 
 /// Instance of [shared.MergedTypeConstraint] specific to the Analyzer.
-typedef MergedTypeConstraint = shared.MergedTypeConstraint<DartType,
-    TypeParameterElement, PromotableElement2, InterfaceType, InterfaceElement>;
+typedef MergedTypeConstraint = shared.MergedTypeConstraint<
+    DartType,
+    TypeParameterElement,
+    PromotableElementImpl2,
+    InterfaceType,
+    InterfaceElement>;
 
 /// Instance of [shared.TypeConstraintFromArgument] specific to the Analyzer.
-typedef TypeConstraintFromArgument = shared.TypeConstraintFromArgument<DartType,
-    PromotableElement2, TypeParameterElement, InterfaceType, InterfaceElement>;
+typedef TypeConstraintFromArgument = shared.TypeConstraintFromArgument<
+    DartType,
+    PromotableElementImpl2,
+    TypeParameterElement,
+    InterfaceType,
+    InterfaceElement>;
 
 /// Instance of [shared.TypeConstraintFromExtendsClause] specific to the Analyzer.
 typedef TypeConstraintFromExtendsClause
-    = shared.TypeConstraintFromExtendsClause<DartType, PromotableElement2,
+    = shared.TypeConstraintFromExtendsClause<DartType, PromotableElementImpl2,
         TypeParameterElement, InterfaceType, InterfaceElement>;
 
 /// Instance of [shared.TypeConstraintFromFunctionContext] specific to the Analyzer.
@@ -52,7 +59,7 @@
         DartType,
         DartType,
         DartType,
-        PromotableElement2,
+        PromotableElementImpl2,
         TypeParameterElement,
         InterfaceType,
         InterfaceElement>;
@@ -62,19 +69,23 @@
     DartType,
     DartType,
     DartType,
-    PromotableElement2,
+    PromotableElementImpl2,
     TypeParameterElement,
     InterfaceType,
     InterfaceElement>;
 
 /// Instance of [shared.TypeConstraintOrigin] specific to the Analyzer.
-typedef TypeConstraintOrigin = shared.TypeConstraintOrigin<DartType,
-    PromotableElement2, TypeParameterElement, InterfaceType, InterfaceElement>;
+typedef TypeConstraintOrigin = shared.TypeConstraintOrigin<
+    DartType,
+    PromotableElementImpl2,
+    TypeParameterElement,
+    InterfaceType,
+    InterfaceElement>;
 
 /// Instance of [shared.UnknownTypeConstraintOrigin] specific to the Analyzer.
 typedef UnknownTypeConstraintOrigin = shared.UnknownTypeConstraintOrigin<
     DartType,
-    PromotableElement2,
+    PromotableElementImpl2,
     TypeParameterElement,
     InterfaceType,
     InterfaceElement>;
@@ -84,7 +95,7 @@
 class TypeConstraintGatherer extends shared.TypeConstraintGenerator<
         DartType,
         ParameterElement,
-        PromotableElement2,
+        PromotableElementImpl2,
         TypeParameterElement,
         InterfaceType,
         InterfaceElement,
@@ -93,7 +104,7 @@
         shared.TypeConstraintGeneratorMixin<
             DartType,
             ParameterElement,
-            PromotableElement2,
+            PromotableElementImpl2,
             TypeParameterElement,
             InterfaceType,
             InterfaceElement,
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 b3b114e..e90d752 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -7,12 +7,12 @@
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/token.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/dart/element/type_provider.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_schema.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
@@ -103,7 +103,7 @@
         whyNotPromoted: whyNotPromoted, contextType: contextType);
 
     if (flow != null) {
-      if (writeElement2 is PromotableElement2) {
+      if (writeElement2 is PromotableElementImpl2) {
         flow.write(node, writeElement2, SharedTypeView(node.typeOrThrow),
             hasRead ? null : right);
       }
@@ -362,7 +362,7 @@
 
     if (left is SimpleIdentifier) {
       var element = left.element;
-      if (element is PromotableElement2) {
+      if (element is PromotableElementImpl2) {
         var assigned = flowAnalysis.isDefinitelyAssigned(left, element);
         var unassigned = flowAnalysis.isDefinitelyUnassigned(left, element);
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
index 4b2d8d6..656cab3 100644
--- a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
@@ -8,12 +8,12 @@
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.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/dart/element/type_provider.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_schema.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
@@ -141,13 +141,13 @@
 
     if (left is SimpleIdentifierImpl && right is NullLiteralImpl) {
       var element = left.element;
-      if (element is PromotableElement2 &&
+      if (element is PromotableElementImpl2 &&
           flowAnalysis.isDefinitelyUnassigned(left, element)) {
         reportNullComparison(left, node.operator);
       }
     } else if (right is SimpleIdentifierImpl && left is NullLiteralImpl) {
       var element = right.element;
-      if (element is PromotableElement2 &&
+      if (element is PromotableElementImpl2 &&
           flowAnalysis.isDefinitelyUnassigned(right, element)) {
         reportNullComparison(node.operator, right);
       }
diff --git a/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
index df7f403..9fa65e1 100644
--- a/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
@@ -54,7 +54,8 @@
 
   /// For each top level or class level declaration, the assigned variables
   /// information that was computed for it.
-  final Map<AstNode, AssignedVariablesForTesting<AstNode, PromotableElement2>>
+  final Map<AstNode,
+          AssignedVariablesForTesting<AstNode, PromotableElementImpl2>>
       assignedVariables = {};
 
   /// For each expression that led to an error because it was not promoted, a
@@ -76,7 +77,7 @@
   final TypeSystemOperations typeOperations;
 
   /// Precomputed sets of potentially assigned variables.
-  AssignedVariables<AstNode, PromotableElement2>? assignedVariables;
+  AssignedVariables<AstNode, PromotableElementImpl2>? assignedVariables;
 
   /// The result for post-resolution stages of analysis, for testing only.
   final FlowAnalysisDataForTesting? dataForTesting;
@@ -95,7 +96,7 @@
   final bool inferenceUpdate4Enabled;
 
   /// The current flow, when resolving a function body, or `null` otherwise.
-  FlowAnalysis<AstNode, Statement, Expression, PromotableElement2,
+  FlowAnalysis<AstNode, Statement, Expression, PromotableElementImpl2,
       SharedTypeView<DartType>>? flow;
 
   FlowAnalysisHelper(bool retainDataForTesting, FeatureSet featureSet,
@@ -173,10 +174,10 @@
         retainDataForTesting: dataForTesting != null, visit: visit);
     if (dataForTesting != null) {
       dataForTesting!.assignedVariables[node] = assignedVariables
-          as AssignedVariablesForTesting<AstNode, PromotableElement2>;
+          as AssignedVariablesForTesting<AstNode, PromotableElementImpl2>;
     }
     flow = isNonNullableByDefault
-        ? FlowAnalysis<AstNode, Statement, Expression, PromotableElement2,
+        ? FlowAnalysis<AstNode, Statement, Expression, PromotableElementImpl2,
             SharedTypeView<DartType>>(
             typeOperations,
             assignedVariables!,
@@ -185,7 +186,7 @@
             fieldPromotionEnabled: fieldPromotionEnabled,
             inferenceUpdate4Enabled: inferenceUpdate4Enabled,
           )
-        : FlowAnalysis<AstNode, Statement, Expression, PromotableElement2,
+        : FlowAnalysis<AstNode, Statement, Expression, PromotableElementImpl2,
                 SharedTypeView<DartType>>.legacy(
             typeOperations, assignedVariables!);
   }
@@ -235,7 +236,10 @@
 
     if (parameters != null) {
       for (var parameter in parameters.parameters) {
-        var declaredElement = parameter.declaredFragment!.element;
+        // TODO(paulberry): try to remove this cast by changing `parameters` to
+        // a `FormalParameterListImpl`
+        var declaredElement =
+            parameter.declaredFragment!.element as PromotableElementImpl2;
         // TODO(paulberry): `skipDuplicateCheck` is currently needed to work
         // around a failure in duplicate_definition_test.dart; fix this.
         flow!.declare(declaredElement, SharedTypeView(declaredElement.type),
@@ -263,7 +267,7 @@
 
   bool isDefinitelyAssigned(
     SimpleIdentifier node,
-    PromotableElement2 element,
+    PromotableElementImpl2 element,
   ) {
     var isAssigned = flow!.isAssigned(element);
 
@@ -280,7 +284,7 @@
 
   bool isDefinitelyUnassigned(
     SimpleIdentifier node,
-    PromotableElement2 element,
+    PromotableElementImpl2 element,
   ) {
     var isUnassigned = flow!.isUnassigned(element);
 
@@ -335,7 +339,8 @@
       var variables = node.variables;
       for (var i = 0; i < variables.length; ++i) {
         var variable = variables[i];
-        var declaredElement = variable.declaredElement2 as PromotableElement2;
+        var declaredElement =
+            variable.declaredElement2 as PromotableElementImpl2;
         flow!.declare(declaredElement, SharedTypeView(declaredElement.type),
             initialized: variable.initializer != null);
       }
@@ -343,11 +348,11 @@
   }
 
   /// Computes the [AssignedVariables] map for the given [node].
-  static AssignedVariables<AstNode, PromotableElement2>
+  static AssignedVariables<AstNode, PromotableElementImpl2>
       computeAssignedVariables(AstNode node, FormalParameterList? parameters,
           {bool retainDataForTesting = false,
           void Function(AstVisitor<Object?> visitor)? visit}) {
-    AssignedVariables<AstNode, PromotableElement2> assignedVariables =
+    AssignedVariables<AstNode, PromotableElementImpl2> assignedVariables =
         retainDataForTesting
             ? AssignedVariablesForTesting()
             : AssignedVariables();
@@ -418,10 +423,10 @@
 
 class TypeSystemOperations
     with
-        TypeAnalyzerOperationsMixin<DartType, PromotableElement2,
+        TypeAnalyzerOperationsMixin<DartType, PromotableElementImpl2,
             TypeParameterElement, InterfaceType, InterfaceElement>
     implements
-        TypeAnalyzerOperations<DartType, PromotableElement2,
+        TypeAnalyzerOperations<DartType, PromotableElementImpl2,
             TypeParameterElement, InterfaceType, InterfaceElement> {
   final bool strictCasts;
   final TypeSystemImpl typeSystem;
@@ -1189,7 +1194,7 @@
   @override
   DartType getType(SimpleIdentifier node, {required bool isRead}) {
     var variable = node.element as VariableElement2;
-    if (variable is PromotableElement2) {
+    if (variable is PromotableElementImpl2) {
       var promotedType = isRead
           ? _manager.flow?.variableRead(node, variable)
           : _manager.flow?.promotedType(variable);
diff --git a/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
index 97dffdc..3c70e91 100644
--- a/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/for_resolver.dart
@@ -123,10 +123,10 @@
   void _forEachParts(AstNode node, bool isAsync, ForEachParts forEachParts,
       void Function() visitBody) {
     Expression iterable = forEachParts.iterable;
-    DeclaredIdentifier? loopVariable;
+    DeclaredIdentifierImpl? loopVariable;
     SimpleIdentifier? identifier;
     Element2? identifierElement;
-    if (forEachParts is ForEachPartsWithDeclaration) {
+    if (forEachParts is ForEachPartsWithDeclarationImpl) {
       loopVariable = forEachParts.loopVariable;
     } else if (forEachParts is ForEachPartsWithIdentifier) {
       identifier = forEachParts.identifier;
@@ -188,7 +188,7 @@
     }
 
     _resolver.flowAnalysis.flow?.forEach_bodyBegin(node);
-    if (identifierElement is PromotableElement2 &&
+    if (identifierElement is PromotableElementImpl2 &&
         forEachParts is ForEachPartsWithIdentifier) {
       _resolver.flowAnalysis.flow?.write(
           forEachParts, identifierElement, SharedTypeView(elementType), null);
diff --git a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
index 37a2199..a07a2b2 100644
--- a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
@@ -6,11 +6,11 @@
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/token.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/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
@@ -177,7 +177,7 @@
       }
       if (operand is SimpleIdentifier) {
         var element = operand.element;
-        if (element is PromotableElement2) {
+        if (element is PromotableElementImpl2) {
           if (_resolver.definingLibrary.featureSet
               .isEnabled(Feature.inference_update_4)) {
             _resolver.flowAnalysis.flow?.postIncDec(
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
index 29b445e..09c0d2c 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
@@ -5,12 +5,12 @@
 import 'package:_fe_analyzer_shared/src/types/shared_type.dart';
 import 'package:analyzer/dart/ast/token.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/dart/element/type_provider.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_schema.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
@@ -236,7 +236,7 @@
         }
         if (operand is SimpleIdentifier) {
           var element = operand.element;
-          if (element is PromotableElement2) {
+          if (element is PromotableElementImpl2) {
             _resolver.flowAnalysis.flow
                 ?.write(node, element, SharedTypeView(staticType), null);
           }
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 3284b97..2a54daa 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -1928,7 +1928,7 @@
 }
 
 class _VariableBinder
-    extends VariableBinder<DartPatternImpl, PromotableElement2> {
+    extends VariableBinder<DartPatternImpl, PromotableElementImpl2> {
   final TypeProvider typeProvider;
 
   _VariableBinder({
@@ -1978,7 +1978,7 @@
 }
 
 class _VariableBinderErrors
-    implements VariableBinderErrors<DartPatternImpl, PromotableElement2> {
+    implements VariableBinderErrors<DartPatternImpl, PromotableElementImpl2> {
   final ResolutionVisitor visitor;
 
   _VariableBinderErrors(this.visitor);
diff --git a/pkg/analyzer/lib/src/dart/resolver/shared_type_analyzer.dart b/pkg/analyzer/lib/src/dart/resolver/shared_type_analyzer.dart
index 281b707..0f1f4b4 100644
--- a/pkg/analyzer/lib/src/dart/resolver/shared_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/shared_type_analyzer.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/diagnostic/diagnostic_factory.dart';
 import 'package:analyzer/src/error/codes.dart';
 
@@ -20,8 +21,14 @@
 /// analyzer's [ErrorReporter] class.
 class SharedTypeAnalyzerErrors
     implements
-        shared.TypeAnalyzerErrors<AstNode, Statement, Expression,
-            PromotableElement2, SharedTypeView<DartType>, DartPattern, void> {
+        shared.TypeAnalyzerErrors<
+            AstNode,
+            Statement,
+            Expression,
+            PromotableElementImpl2,
+            SharedTypeView<DartType>,
+            DartPattern,
+            void> {
   final ErrorReporter _errorReporter;
 
   SharedTypeAnalyzerErrors(this._errorReporter);
diff --git a/pkg/analyzer/lib/src/error/dead_code_verifier.dart b/pkg/analyzer/lib/src/error/dead_code_verifier.dart
index 456e446..89fa8b4 100644
--- a/pkg/analyzer/lib/src/error/dead_code_verifier.dart
+++ b/pkg/analyzer/lib/src/error/dead_code_verifier.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/source/source_range.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
@@ -466,7 +467,7 @@
     target = target?.unParenthesized;
     if (target is SimpleIdentifier) {
       var element = target.element;
-      if (element is PromotableElement2 &&
+      if (element is PromotableElementImpl2 &&
           flowAnalysis.isDefinitelyUnassigned(target, element)) {
         var parent = node.parent;
         while (parent is MethodInvocation ||
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index bddd20a..f3d8bc0 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -98,7 +98,7 @@
 bool Function(Source) inferenceLoggingPredicate = (_) => false;
 
 typedef SharedMatchContext = shared.MatchContext<AstNode, Expression,
-    DartPattern, SharedTypeView<DartType>, PromotableElement2>;
+    DartPattern, SharedTypeView<DartType>, PromotableElementImpl2>;
 
 typedef SharedPatternField
     = shared.RecordPatternField<PatternFieldImpl, DartPatternImpl>;
@@ -125,7 +125,7 @@
             AstNode,
             Statement,
             Expression,
-            PromotableElement2,
+            PromotableElementImpl2,
             DartPattern,
             void,
             TypeParameterElement,
@@ -437,7 +437,7 @@
   ExecutableElement? get enclosingFunction => _enclosingFunction;
 
   @override
-  FlowAnalysis<AstNode, Statement, Expression, PromotableElement2,
+  FlowAnalysis<AstNode, Statement, Expression, PromotableElementImpl2,
       SharedTypeView<DartType>> get flow => flowAnalysis.flow!;
 
   bool get isConstructorTearoffsEnabled =>
@@ -454,7 +454,7 @@
   @override
   shared.TypeAnalyzerOperations<
       DartType,
-      PromotableElement2,
+      PromotableElementImpl2,
       TypeParameterElement,
       InterfaceType,
       InterfaceElement> get operations => flowAnalysis.typeOperations;
@@ -668,9 +668,8 @@
       return;
     }
 
-    if (element is VariableElement2) {
-      var assigned = flowAnalysis.isDefinitelyAssigned(
-          node, element as PromotableElement2);
+    if (element is PromotableElementImpl2) {
+      var assigned = flowAnalysis.isDefinitelyAssigned(node, element);
       var unassigned = flowAnalysis.isDefinitelyUnassigned(node, element);
 
       if (element.isLate) {
@@ -978,7 +977,7 @@
   }
 
   @override
-  SwitchExpressionMemberInfo<AstNode, Expression, PromotableElement2>
+  SwitchExpressionMemberInfo<AstNode, Expression, PromotableElementImpl2>
       getSwitchExpressionMemberInfo(
     covariant SwitchExpressionImpl node,
     int index,
@@ -996,12 +995,12 @@
   }
 
   @override
-  SwitchStatementMemberInfo<AstNode, Statement, Expression, PromotableElement2>
-      getSwitchStatementMemberInfo(
+  SwitchStatementMemberInfo<AstNode, Statement, Expression,
+      PromotableElementImpl2> getSwitchStatementMemberInfo(
     covariant SwitchStatementImpl node,
     int index,
   ) {
-    CaseHeadOrDefaultInfo<AstNode, Expression, PromotableElement2> ofMember(
+    CaseHeadOrDefaultInfo<AstNode, Expression, PromotableElementImpl2> ofMember(
       SwitchMemberImpl member,
     ) {
       if (member is SwitchCaseImpl) {
@@ -1397,7 +1396,7 @@
     required SharedMatchContext context,
   }) {
     var element = node.element2;
-    if (element is! PromotableElement2) {
+    if (element is! PromotableElementImpl2) {
       return PatternResult(
           matchedValueType: SharedTypeView(InvalidTypeImpl.instance));
     }
@@ -1883,7 +1882,7 @@
     if (staticType != null && expression is SimpleIdentifier) {
       var simpleIdentifier = expression as SimpleIdentifier;
       var element = simpleIdentifier.element;
-      if (element is PromotableElement2 &&
+      if (element is PromotableElementImpl2 &&
           !expression.typeOrThrow.isDartCoreNull &&
           typeSystem.isNullable(element.type) &&
           typeSystem.isNonNullable(staticType) &&
@@ -3819,9 +3818,13 @@
       for (var i = 0; i < catchLength; ++i) {
         var catchClause = catchClauses[i];
         nullSafetyDeadCodeVerifier.verifyCatchClause(catchClause);
+        // TODO(paulberry): try to remove these casts by changing `node` to a
+        // `TryStatementImpl`
         flow.tryCatchStatement_catchBegin(
-          catchClause.exceptionParameter?.declaredElement2,
-          catchClause.stackTraceParameter?.declaredElement2,
+          catchClause.exceptionParameter?.declaredElement2
+              as PromotableElementImpl2?,
+          catchClause.stackTraceParameter?.declaredElement2
+              as PromotableElementImpl2?,
         );
         catchClause.accept(this);
         flow.tryCatchStatement_catchEnd();
@@ -3890,8 +3893,10 @@
       var parent = node.parent as VariableDeclarationList;
       var declaredType = parent.type;
       var initializerStaticType = initializer.typeOrThrow;
-      flowAnalysis.flow?.initialize(node.declaredElement2 as PromotableElement2,
-          SharedTypeView(initializerStaticType), initializer,
+      flowAnalysis.flow?.initialize(
+          node.declaredElement2 as PromotableElementImpl2,
+          SharedTypeView(initializerStaticType),
+          initializer,
           isFinal: parent.isFinal,
           isLate: parent.isLate,
           isImplicitlyTyped: declaredType == null);