Elements. Stop using ConstructorElementMixin in constants evaluation.

Change-Id: I54e22bd9a0068ffa8de5a7ded932131327f672fa
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/437105
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
diff --git a/pkg/analyzer/lib/src/dart/constant/compute.dart b/pkg/analyzer/lib/src/dart/constant/compute.dart
index d8e5e5d..39de746 100644
--- a/pkg/analyzer/lib/src/dart/constant/compute.dart
+++ b/pkg/analyzer/lib/src/dart/constant/compute.dart
@@ -67,8 +67,9 @@
     var constantsInCycle = scc.map((node) => node.constant);
     for (var node in scc) {
       var constant = node.constant;
-      if (constant is ConstructorFragmentImpl) {
-        constant.isCycleFree = false;
+      if (constant is ConstructorElementImpl) {
+        // TODO(scheglov): move the flag to the element
+        constant.firstFragment.isCycleFree = false;
       }
       _getEvaluationEngine(node).generateCycleError(constantsInCycle, constant);
     }
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index 4de239f..f978b32 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -33,7 +33,6 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/exhaustiveness.dart';
 import 'package:analyzer/src/utilities/extensions/ast.dart';
-import 'package:analyzer/src/utilities/extensions/element.dart';
 
 /// Instances of the class `ConstantVerifier` traverse an AST structure looking
 /// for additional errors and warnings not covered by the parser and resolver.
@@ -213,11 +212,7 @@
     if (node.isConst) {
       var constructor = node.constructorName.element;
       if (constructor is ConstructorElementMixin2) {
-        _validateConstructorInvocation(
-          node,
-          constructor.asElement,
-          node.argumentList,
-        );
+        _validateConstructorInvocation(node, constructor, node.argumentList);
       }
     } else {
       super.visitDotShorthandConstructorInvocation(node);
@@ -288,7 +283,7 @@
         CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
       );
 
-      var constructor = node.constructorName.element?.asElement;
+      var constructor = node.constructorName.element;
       if (constructor != null) {
         _validateConstructorInvocation(node, constructor, node.argumentList);
       }
@@ -916,7 +911,7 @@
   /// arguments are constant expressions.
   void _validateConstructorInvocation(
     AstNode node,
-    ConstructorElementMixin constructor,
+    ConstructorElementMixin2 constructor,
     ArgumentList argumentList,
   ) {
     var constantVisitor = ConstantVisitor(
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 297d0f4..c5b036a 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -87,6 +87,10 @@
       constant = element.declaration as ConstantEvaluationTarget;
     }
 
+    if (constant case ConstructorElementMixin2 constructor) {
+      constant = constructor.baseElement;
+    }
+
     var library = constant.library as LibraryElementImpl;
     if (constant is FormalParameterFragmentImpl) {
       if (constant is ConstVariableFragment) {
@@ -166,13 +170,13 @@
 
         constant.evaluationResult = dartConstant;
       }
-    } else if (constant is ConstructorFragmentImpl) {
+    } else if (constant is ConstructorElementImpl) {
       if (constant.isConst) {
         // No evaluation needs to be done; constructor declarations are only in
         // the dependency graph to ensure that any constants referred to in
         // initializer lists and parameter defaults are evaluated before
         // invocations of the constructor.
-        constant.isConstantEvaluated = true;
+        constant.firstFragment.isConstantEvaluated = true;
       }
     } else if (constant is ElementAnnotationImpl) {
       var constNode = constant.annotationAst;
@@ -210,7 +214,7 @@
           constNode,
           element.returnType.typeArguments,
           constNode.arguments!.arguments,
-          element.asElement,
+          element,
           constantVisitor,
         );
         constant.evaluationResult = result;
@@ -258,20 +262,21 @@
     }
 
     ReferenceFinder referenceFinder = ReferenceFinder(callback);
-    if (constant is ConstructorElementMixin) {
-      constant = constant.declaration;
+    if (constant case ConstructorElementMixin2 constructor) {
+      constant = constructor.baseElement;
     }
+
     if (constant is VariableElementOrMember) {
       var declaration = constant.declaration;
       var initializer = declaration.constantInitializer;
       if (initializer != null) {
         initializer.accept(referenceFinder);
       }
-    } else if (constant is ConstructorFragmentImpl) {
+    } else if (constant is ConstructorElementImpl) {
       if (constant.isConst) {
         var redirectedConstructor = getConstRedirectedConstructor(constant);
         if (redirectedConstructor != null) {
-          var redirectedConstructorBase = redirectedConstructor.declaration;
+          var redirectedConstructorBase = redirectedConstructor.baseElement;
           callback(redirectedConstructorBase);
           return;
         } else if (constant.isFactory) {
@@ -302,21 +307,21 @@
             var unnamedConstructor =
                 superclass.element.unnamedConstructor2?.baseElement;
             if (unnamedConstructor != null && unnamedConstructor.isConst) {
-              callback(unnamedConstructor.asElement);
+              callback(unnamedConstructor);
             }
           }
         }
-        for (var field in constant.enclosingElement3.fields) {
+        for (var field in constant.enclosingElement.fields) {
           // Note: non-static const isn't allowed but we handle it anyway so
           // that we won't be confused by incorrect code.
           if ((field.isFinal || field.isConst) &&
               !field.isStatic &&
               field.hasInitializer) {
-            callback(field);
+            callback(field.firstFragment);
           }
         }
-        for (var parameterElement in constant.parameters) {
-          callback(parameterElement);
+        for (var parameterElement in constant.formalParameters) {
+          callback(parameterElement.firstFragment as ParameterElementMixin);
         }
       }
     } else if (constant is ElementAnnotationImpl) {
@@ -333,7 +338,7 @@
         // The annotation is a constructor invocation, so it depends on the
         // constructor.
         var baseElement = element.baseElement;
-        callback(baseElement.firstFragment as ConstructorFragmentImpl);
+        callback(baseElement as ConstructorElementImpl);
       } else {
         // This could happen in the event of invalid code.  The error will be
         // reported at constant evaluation time.
@@ -363,7 +368,7 @@
     AstNode node,
     List<TypeImpl>? typeArguments,
     List<Expression> arguments,
-    ConstructorElementMixin constructor,
+    ConstructorElementMixin2 constructor,
     ConstantVisitor constantVisitor, {
     ConstructorInvocation? invocation,
   }) {
@@ -412,7 +417,7 @@
     AstNode node,
     List<TypeImpl>? typeArguments,
     List<Expression> arguments,
-    ConstructorElementMixin constructor,
+    ConstructorElementMixin2 constructor,
     ConstantVisitor constantVisitor, {
     ConstructorInvocation? invocation,
   }) {
@@ -453,7 +458,7 @@
         element: constant.asElement2!,
         diagnosticCode: CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT,
       );
-    } else if (constant is ConstructorFragmentImpl) {
+    } else if (constant is ConstructorElementImpl) {
       // We don't report cycle errors on constructor declarations here since
       // there is nowhere to put the error information.
       //
@@ -472,15 +477,14 @@
 
   /// If [constructor] redirects to another const constructor, return the
   /// const constructor it redirects to.  Otherwise return `null`.
-  static ConstructorElementMixin? getConstRedirectedConstructor(
-    ConstructorElementMixin constructor,
+  static ConstructorElementMixin2? getConstRedirectedConstructor(
+    ConstructorElementMixin2 constructor,
   ) {
     if (!constructor.isFactory) {
       return null;
     }
     var typeProvider = constructor.library.typeProvider;
-    if (constructor.asElement2.enclosingElement ==
-        typeProvider.symbolElement2) {
+    if (constructor.enclosingElement == typeProvider.symbolElement2) {
       // The dart:core.Symbol has a const factory constructor that redirects
       // to dart:_internal.Symbol.  That in turn redirects to an external
       // const constructor, which we won't be able to evaluate.
@@ -488,7 +492,7 @@
       // let [evaluateInstanceCreationExpression] handle it specially.
       return null;
     }
-    var redirectedConstructor = constructor.asElement2.redirectedConstructor2;
+    var redirectedConstructor = constructor.redirectedConstructor2;
     if (redirectedConstructor == null) {
       // This can happen if constructor is an external factory constructor.
       return null;
@@ -499,7 +503,7 @@
       // [ErrorVerifier.checkForRedirectToNonConstConstructor()]).
       return null;
     }
-    return redirectedConstructor.asElement as ConstructorElementMixin;
+    return redirectedConstructor;
   }
 
   static _EnumConstant? _enumConstant(VariableFragmentImpl element) {
@@ -911,7 +915,7 @@
         node,
         constructor.returnType.typeArguments,
         node.argumentList.arguments,
-        constructor.asElement,
+        constructor,
         this,
       );
     }
@@ -1039,7 +1043,7 @@
       // https://github.com/dart-lang/sdk/issues/47061
       return InvalidConstant.genericError(node: node);
     }
-    var constructor = node.constructorName.element?.asElement;
+    var constructor = node.constructorName.element;
     if (constructor == null) {
       // Couldn't resolve the constructor so we can't compute a value.  No
       // problem - the error has already been reported.
@@ -2834,7 +2838,10 @@
   /// because they usually happen in a different source. But they still should
   /// cause a constant evaluation error for the current node.
   late final DiagnosticReporter _externalDiagnosticReporter =
-      DiagnosticReporter(_externalDiagnosticListener, _constructor.source);
+      DiagnosticReporter(
+        _externalDiagnosticListener,
+        _constructor.firstFragment.libraryFragment.source,
+      );
 
   late final ConstantVisitor _initializerVisitor = ConstantVisitor(
     _evaluationEngine,
@@ -2848,7 +2855,7 @@
   /// The node used for most error reporting.
   final AstNode _errorNode;
 
-  final ConstructorElementMixin _constructor;
+  final ConstructorElementMixin2 _constructor;
 
   final List<TypeImpl>? _typeArguments;
 
@@ -2897,9 +2904,9 @@
 
   /// Evaluates this constructor call as a factory constructor call.
   Constant evaluateFactoryConstructorCall(List<Expression> arguments) {
-    var definingClass = _constructor.asElement2.enclosingElement;
+    var definingClass = _constructor.enclosingElement;
     var argumentCount = arguments.length;
-    if (_constructor.name2 == "fromEnvironment") {
+    if (_constructor.name3 == "fromEnvironment") {
       if (!_checkFromEnvironmentArguments(arguments, definingType)) {
         return InvalidConstant.forEntity(
           entity: _errorNode,
@@ -2920,26 +2927,26 @@
         return FromEnvironmentEvaluator(
           typeSystem,
           _declaredVariables,
-        ).getBool2(variableName, _namedValues, _constructor.asElement2);
+        ).getBool2(variableName, _namedValues, _constructor);
       } else if (definingClass == typeProvider.intElement2) {
         return FromEnvironmentEvaluator(
           typeSystem,
           _declaredVariables,
-        ).getInt2(variableName, _namedValues, _constructor.asElement2);
+        ).getInt2(variableName, _namedValues, _constructor);
       } else if (definingClass == typeProvider.stringElement2) {
         return FromEnvironmentEvaluator(
           typeSystem,
           _declaredVariables,
-        ).getString2(variableName, _namedValues, _constructor.asElement2);
+        ).getString2(variableName, _namedValues, _constructor);
       }
-    } else if (_constructor.name2 == 'hasEnvironment' &&
+    } else if (_constructor.name3 == 'hasEnvironment' &&
         definingClass == typeProvider.boolElement2) {
       var name = argumentCount < 1 ? null : firstArgument?.toStringValue();
       return FromEnvironmentEvaluator(
         typeSystem,
         _declaredVariables,
       ).hasEnvironment(name);
-    } else if (_constructor.name2 == 'new' &&
+    } else if (_constructor.name3 == 'new' &&
         definingClass == typeProvider.symbolElement2 &&
         argumentCount == 1) {
       if (!_checkSymbolArguments(arguments)) {
@@ -3011,17 +3018,17 @@
 
   void _addImplicitArgumentsFromSuperFormals(List<Expression> superArguments) {
     var positionalIndex = 0;
-    for (var parameter in _constructor.parameters) {
-      if (parameter is SuperFormalParameterElementOrMember) {
+    for (var parameter in _constructor.formalParameters) {
+      if (parameter is SuperFormalParameterElement) {
         var value =
             SimpleIdentifierImpl(
                 token: StringToken(
                   TokenType.STRING,
-                  parameter.name2 ?? '',
-                  parameter.nameOffset,
+                  parameter.name3 ?? '',
+                  parameter.firstFragment.nameOffset2 ?? -1,
                 ),
               )
-              ..element = parameter.asElement2
+              ..element = parameter
               ..setPseudoExpressionStaticType(parameter.type);
         if (parameter.isPositional) {
           superArguments.insert(positionalIndex++, value);
@@ -3032,10 +3039,10 @@
                 label: SimpleIdentifierImpl(
                   token: StringToken(
                     TokenType.STRING,
-                    parameter.name2 ?? '',
-                    parameter.nameOffset,
+                    parameter.name3 ?? '',
+                    parameter.firstFragment.nameOffset2 ?? -1,
                   ),
-                )..element = parameter.asElement2,
+                )..element = parameter,
                 colon: StringToken(TokenType.COLON, ':', -1),
               ),
               expression: value,
@@ -3051,10 +3058,10 @@
   /// Returns an [InvalidConstant] if one is found, or `null` otherwise.
   InvalidConstant? _checkFields() {
     var substitution = Substitution.fromInterfaceType(_constructor.returnType);
-    var fields = _constructor.declaration.enclosingElement3.fields;
+    var fields = _constructor.baseElement.enclosingElement.fields;
     for (var field in fields) {
       if ((field.isFinal || field.isConst) && !field.isStatic) {
-        var fieldValue = field.evaluationResult;
+        var fieldValue = field.firstFragment.evaluationResult;
 
         // It is possible that the evaluation result is null.
         // This happens for example when we have duplicate fields.
@@ -3066,20 +3073,20 @@
         var fieldType = substitution.substituteType(field.type);
         if (!typeSystem.runtimeTypeMatch(fieldValue, fieldType)) {
           var isRuntimeException = hasTypeParameterReference(field.type);
-          var errorNode = field.constantInitializer ?? _errorNode;
+          var errorNode = field.constantInitializer2?.expression ?? _errorNode;
           return InvalidConstant.forEntity(
             entity: errorNode,
             diagnosticCode:
                 CompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
             arguments: [
               fieldValue.type.getDisplayString(),
-              field.name2 ?? '',
+              field.name3 ?? '',
               fieldType.getDisplayString(),
             ],
             isRuntimeException: isRuntimeException,
           );
         }
-        _fieldMap[field.name2 ?? ''] = fieldValue;
+        _fieldMap[field.name3 ?? ''] = fieldValue;
       }
     }
     return null;
@@ -3129,7 +3136,7 @@
   /// redirecting constructor invocation, an [InvalidConstant], or an
   /// incomplete state for further evaluation.
   _InitializersEvaluationResult _checkInitializers() {
-    var constructorBase = _constructor.declaration;
+    var constructorBase = _constructor.baseElement;
     // If we encounter a superinitializer, store the name of the constructor,
     // and the arguments.
     String? superName;
@@ -3200,7 +3207,12 @@
             if (evaluationResult.contextMessages.isEmpty) {
               evaluationResult.contextMessages.add(
                 DiagnosticMessageImpl(
-                  filePath: _constructor.source.fullName,
+                  filePath:
+                      _constructor
+                          .firstFragment
+                          .libraryFragment
+                          .source
+                          .fullName,
                   length: evaluationResult.length,
                   message:
                       "The error is in the field initializer of "
@@ -3233,10 +3245,10 @@
       } else if (initializer is RedirectingConstructorInvocationImpl) {
         // This is a redirecting constructor, so just evaluate the constructor
         // it redirects to.
-        var baseElement = initializer.element?.lastFragment;
+        var baseElement = initializer.element;
         if (baseElement != null && baseElement.isConst) {
           // Instantiate the constructor with the in-scope type arguments.
-          var constructor = ConstructorMember.from(baseElement, definingType);
+          var constructor = ConstructorMember.from2(baseElement, definingType);
           var result = _evaluationEngine.evaluateConstructorCall(
             _library,
             _errorNode,
@@ -3296,7 +3308,12 @@
             if (evaluationResult.contextMessages.isEmpty) {
               evaluationResult.contextMessages.add(
                 DiagnosticMessageImpl(
-                  filePath: _constructor.source.fullName,
+                  filePath:
+                      _constructor
+                          .firstFragment
+                          .libraryFragment
+                          .source
+                          .fullName,
                   length: evaluationResult.length,
                   message:
                       "The error is in the assert initializer of "
@@ -3339,17 +3356,17 @@
   ///
   /// Returns an [InvalidConstant] if one is found, or `null` otherwise.
   InvalidConstant? _checkParameters(List<Expression> arguments) {
-    var parameters = _constructor.parameters;
+    var parameters = _constructor.formalParameters;
     var parameterCount = parameters.length;
 
     for (var i = 0; i < parameterCount; i++) {
       var parameter = parameters[i];
-      var baseParameter = parameter.declaration;
+      var baseParameter = parameter.baseElement;
       DartObjectImpl? argumentValue;
       AstNode? errorTarget;
       if (baseParameter.isNamed) {
-        argumentValue = _namedValues[baseParameter.name2 ?? ''];
-        errorTarget = _namedNodes[baseParameter.name2 ?? ''];
+        argumentValue = _namedValues[baseParameter.name3 ?? ''];
+        errorTarget = _namedNodes[baseParameter.name3 ?? ''];
       } else if (i < _argumentValues.length) {
         argumentValue = _argumentValues[i];
         errorTarget = arguments[i];
@@ -3361,7 +3378,7 @@
       if (argumentValue == null && baseParameter.isOptional) {
         // The parameter is an optional positional parameter for which no value
         // was provided, so use the default value.
-        var evaluationResult = baseParameter.evaluationResult;
+        var evaluationResult = baseParameter.firstFragment.evaluationResult;
         if (evaluationResult == null) {
           // No default was provided, so the default value is null.
           argumentValue = ConstantEvaluationEngine._nullObject(_library);
@@ -3393,9 +3410,9 @@
           );
         }
         if (baseParameter.isInitializingFormal) {
-          var field = (parameter as FieldFormalParameterElementOrMember).field;
+          var field = (parameter as FieldFormalParameterElement).field2;
           if (field != null) {
-            var fieldType = field.type;
+            var fieldType = field.type as TypeImpl;
             if (fieldType != parameter.type) {
               // We've already checked that the argument can be assigned to the
               // parameter; we also need to check that it can be assigned to
@@ -3414,7 +3431,7 @@
                 );
               }
             }
-            var fieldName = field.name2 ?? '';
+            var fieldName = field.name3 ?? '';
             if (_fieldMap.containsKey(fieldName)) {
               return InvalidConstant.forEntity(
                 entity: _errorNode,
@@ -3425,7 +3442,7 @@
             _fieldMap[fieldName] = argumentValue;
           }
         }
-        _parameterMap[baseParameter.name2 ?? ''] = argumentValue;
+        _parameterMap[baseParameter.name3 ?? ''] = argumentValue;
       }
     }
     return null;
@@ -3445,10 +3462,10 @@
   }) {
     var superclass = definingType.superclass;
     if (superclass != null && !superclass.isDartCoreObject) {
-      var superConstructor =
-          superclass
-              .lookUpConstructor(superName, _constructor.library)
-              ?.asElement;
+      var superConstructor = superclass.lookUpConstructor(
+        superName,
+        _constructor.library,
+      );
       if (superConstructor == null) {
         return null;
       }
@@ -3472,7 +3489,12 @@
             if (evaluationResult.contextMessages.isEmpty) {
               evaluationResult.contextMessages.add(
                 DiagnosticMessageImpl(
-                  filePath: _constructor.source.fullName,
+                  filePath:
+                      _constructor
+                          .firstFragment
+                          .libraryFragment
+                          .source
+                          .fullName,
                   length: evaluationResult.length,
                   message:
                       "The error is in the super constructor invocation "
@@ -3524,7 +3546,7 @@
 
   void _checkTypeParameters() {
     var typeParameters =
-        _constructor.declaration.enclosingElement3.typeParameters;
+        _constructor.baseElement.enclosingElement.typeParameters2;
     var typeArguments = _typeArguments;
     if (typeParameters.isNotEmpty &&
         typeArguments != null &&
@@ -3532,7 +3554,7 @@
       for (int i = 0; i < typeParameters.length; i++) {
         var typeParameter = typeParameters[i];
         var typeArgument = typeArguments[i];
-        _typeParameterMap[typeParameter.asElement2] = typeArgument;
+        _typeParameterMap[typeParameter] = typeArgument;
       }
     }
   }
@@ -3540,17 +3562,17 @@
   /// Returns a context message that mimics a stack trace where [superConstructor] is
   /// called by [constructor]
   DiagnosticMessageImpl _stackTraceContextMessage(
-    ConstructorElementMixin superConstructor,
-    ConstructorElementMixin constructor,
+    ConstructorElementMixin2 superConstructor,
+    ConstructorElementMixin2 constructor,
   ) {
     return DiagnosticMessageImpl(
-      filePath: constructor.source.fullName,
-      length: constructor.nameLength,
+      filePath: constructor.firstFragment.libraryFragment.source.fullName,
+      length: 1,
       message:
           "The evaluated constructor '${superConstructor.displayName}' "
           "is called by '${constructor.displayName}' and "
           "'${constructor.displayName}' is defined here.",
-      offset: constructor.nameOffset,
+      offset: constructor.firstFragment.offset,
       url: null,
     );
   }
@@ -3561,7 +3583,7 @@
     DeclaredVariables declaredVariables,
     LibraryElementImpl library,
     AstNode node,
-    ConstructorElementMixin constructor,
+    ConstructorElementMixin2 constructor,
     List<TypeImpl>? typeArguments,
     List<Expression> arguments,
     ConstantVisitor constantVisitor, {
@@ -3580,7 +3602,7 @@
       );
     }
 
-    if (!constructor.declaration.isCycleFree) {
+    if (!constructor.baseElement.firstFragment.isCycleFree) {
       // It's not safe to evaluate this constructor, so bail out.
       //
       // Instead of reporting an error at the call-sites, we will report an
@@ -3616,8 +3638,8 @@
         namedValues[name] = argumentConstant;
       } else {
         var parameterType =
-            i < constructor.parameters.length
-                ? constructor.parameters[i].type
+            i < constructor.formalParameters.length
+                ? constructor.formalParameters[i].type
                 : InvalidTypeImpl.instance;
         var argumentConstant = constantVisitor._valueOf(
           argument,
@@ -3632,7 +3654,7 @@
     }
 
     invocation ??= ConstructorInvocation(
-      constructor.asElement2,
+      constructor,
       argumentValues,
       namedValues,
     );
@@ -3667,19 +3689,19 @@
   /// chain terminates. If there is a problem (e.g. a redirection can't be
   /// found, or a cycle is encountered), the chain will be followed as far as
   /// possible and then a const factory constructor will be returned.
-  static ConstructorElementMixin _followConstantRedirectionChain(
-    ConstructorElementMixin constructor,
+  static ConstructorElementMixin2 _followConstantRedirectionChain(
+    ConstructorElementMixin2 constructor,
   ) {
-    var constructorsVisited = <ConstructorElementMixin>{};
+    var constructorsVisited = <ConstructorElementMixin2>{};
     while (true) {
       var redirectedConstructor =
           ConstantEvaluationEngine.getConstRedirectedConstructor(constructor);
       if (redirectedConstructor == null) {
         break;
       } else {
-        var constructorBase = constructor.declaration;
+        var constructorBase = constructor.baseElement;
         constructorsVisited.add(constructorBase);
-        var redirectedConstructorBase = redirectedConstructor.declaration;
+        var redirectedConstructorBase = redirectedConstructor.baseElement;
         if (constructorsVisited.contains(redirectedConstructorBase)) {
           // Cycle in redirecting factory constructors--this is not allowed
           // and is checked elsewhere--see
diff --git a/pkg/analyzer/lib/src/dart/constant/utilities.dart b/pkg/analyzer/lib/src/dart/constant/utilities.dart
index 15ab98a..f902e30 100644
--- a/pkg/analyzer/lib/src/dart/constant/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/constant/utilities.dart
@@ -155,7 +155,7 @@
     if (node.constKeyword != null) {
       var fragment = node.declaredFragment;
       if (fragment != null) {
-        constantsToCompute.add(fragment);
+        constantsToCompute.add(fragment.element);
         constantsToCompute.addAll(fragment.parameters);
       }
     }
@@ -228,7 +228,7 @@
     if (node.isConst) {
       var constructor = node.constructorName.element?.baseElement;
       if (constructor != null && constructor.isConst) {
-        _callback(constructor.firstFragment);
+        _callback(constructor);
       }
     }
     super.visitInstanceCreationExpression(node);
@@ -250,7 +250,7 @@
     super.visitRedirectingConstructorInvocation(node);
     var target = node.element?.baseElement;
     if (target != null) {
-      _callback(target.firstFragment);
+      _callback(target);
     }
   }
 
@@ -273,7 +273,7 @@
     super.visitSuperConstructorInvocation(node);
     var constructor = node.element?.baseElement;
     if (constructor != null) {
-      _callback(constructor.firstFragment);
+      _callback(constructor);
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index bb8ce64..eec1db3 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -788,6 +788,9 @@
   }
 
   @override
+  AnalysisContext get context => firstFragment.context;
+
+  @override
   String get displayName {
     var className = enclosingElement.name3 ?? '<null>';
     var name = name3 ?? '<null>';
@@ -828,6 +831,9 @@
   bool get isConst => firstFragment.isConst;
 
   @override
+  bool get isConstantEvaluated => firstFragment.isConstantEvaluated;
+
+  @override
   bool get isDefaultConstructor => firstFragment.isDefaultConstructor;
 
   @override
@@ -845,6 +851,9 @@
   }
 
   @override
+  Source? get librarySource => firstFragment.librarySource;
+
+  @override
   Element get nonSynthetic {
     if (isSynthetic) {
       return enclosingElement;
@@ -869,6 +878,9 @@
   }
 
   @override
+  Source? get source => firstFragment.source;
+
+  @override
   ConstructorElementMixin2? get superConstructor2 {
     _ensureReadResolution();
     return _superConstructor;
@@ -897,8 +909,7 @@
   }
 }
 
-mixin ConstructorElementMixin
-    implements ConstantEvaluationTarget, ExecutableElementOrMember {
+mixin ConstructorElementMixin implements ExecutableElementOrMember {
   @override
   ConstructorFragmentImpl get declaration;
 
@@ -916,19 +927,15 @@
   bool get isGenerative;
 
   @override
-  LibraryElementImpl get library;
-
-  @Deprecated('Use library instead')
-  @override
-  LibraryElementImpl get library2;
-
-  @override
   InterfaceTypeImpl get returnType;
 }
 
 /// Common implementation for methods defined in [ConstructorElement].
 mixin ConstructorElementMixin2
-    implements ExecutableElement2OrMember, ConstructorElement {
+    implements
+        ConstantEvaluationTarget,
+        ExecutableElement2OrMember,
+        ConstructorElement {
   @override
   ConstructorElementImpl get baseElement;
 
@@ -936,7 +943,16 @@
   InterfaceElementImpl get enclosingElement;
 
   @override
+  LibraryElementImpl get library;
+
+  @override
+  ConstructorElementMixin2? get redirectedConstructor2;
+
+  @override
   InterfaceTypeImpl get returnType;
+
+  @override
+  ConstructorElementMixin2? get superConstructor2;
 }
 
 /// A concrete implementation of a [ConstructorFragment].
@@ -977,7 +993,7 @@
   /// is a part of a cycle.
   bool isCycleFree = true;
 
-  @override
+  /// Return whether this constant is evaluated.
   bool isConstantEvaluated = false;
 
   /// Initialize a newly created constructor element to have the given [name]
@@ -1061,10 +1077,6 @@
   @override
   ElementKind get kind => ElementKind.CONSTRUCTOR;
 
-  @Deprecated('Use library instead')
-  @override
-  LibraryElementImpl get library2 => library;
-
   @override
   int get nameLength {
     var nameEnd = this.nameEnd;
@@ -1116,7 +1128,7 @@
     if (!isConstantEvaluated) {
       computeConstants(
         declaredVariables: context.declaredVariables,
-        constants: [this],
+        constants: [element],
         featureSet: library.featureSet,
         configuration: ConstantEvaluationConfiguration(),
       );
@@ -2304,7 +2316,7 @@
   }
 
   @override
-  LibraryElement get library {
+  LibraryElementImpl get library {
     var firstFragment = this.firstFragment as ExecutableFragmentImpl;
     return firstFragment.library;
   }
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 0a7b7e7..2aabe30 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -432,7 +432,9 @@
 /// A parameter element defined in a parameterized type where the values of the
 /// type parameters are known.
 class FieldFormalParameterMember extends ParameterMember
-    implements FieldFormalParameterElementOrMember {
+    implements
+        FieldFormalParameterElementOrMember,
+        FieldFormalParameterElement {
   factory FieldFormalParameterMember({
     required FieldFormalParameterFragmentImpl declaration,
     required MapSubstitution substitution,
@@ -455,6 +457,10 @@
   }) : super._();
 
   @override
+  FieldFormalParameterElementImpl get baseElement =>
+      super.baseElement as FieldFormalParameterElementImpl;
+
+  @override
   FieldFormalParameterFragmentImpl get declaration {
     return _declaration as FieldFormalParameterFragmentImpl;
   }
@@ -470,6 +476,24 @@
   }
 
   @override
+  FieldElement? get field2 {
+    var field = baseElement.field2;
+    if (field == null) {
+      return null;
+    }
+
+    return FieldMember.from(field, substitution);
+  }
+
+  @override
+  FieldFormalParameterFragment get firstFragment => baseElement.firstFragment;
+
+  @override
+  List<FieldFormalParameterFragment> get fragments {
+    return baseElement.fragments;
+  }
+
+  @override
   bool get hasDefaultValue => declaration.hasDefaultValue;
 
   @override
@@ -1340,7 +1364,9 @@
 }
 
 class SuperFormalParameterMember extends ParameterMember
-    implements SuperFormalParameterElementOrMember {
+    implements
+        SuperFormalParameterElementOrMember,
+        SuperFormalParameterElement {
   factory SuperFormalParameterMember({
     required SuperFormalParameterFragmentImpl declaration,
     required MapSubstitution substitution,
@@ -1363,11 +1389,23 @@
   }) : super._();
 
   @override
+  SuperFormalParameterElementImpl get baseElement =>
+      super.baseElement as SuperFormalParameterElementImpl;
+
+  @override
   SuperFormalParameterFragmentImpl get declaration {
     return _declaration as SuperFormalParameterFragmentImpl;
   }
 
   @override
+  SuperFormalParameterFragment get firstFragment => baseElement.firstFragment;
+
+  @override
+  List<SuperFormalParameterFragment> get fragments {
+    return baseElement.fragments;
+  }
+
+  @override
   bool get hasDefaultValue => declaration.hasDefaultValue;
 
   @override
@@ -1383,6 +1421,7 @@
     return ParameterMember.from2(superConstructorParameter, substitution);
   }
 
+  @override
   FormalParameterElement? get superConstructorParameter2 =>
       superConstructorParameter;
 }