Version 3.9.0-290.0.dev

Merge b7ba61acbc82b9867113b6ef2056a3127d071525 into dev
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index ac68e8e..280549c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -110,7 +110,7 @@
 // TODO(scheglov): Clean up the list of implicitly analyzed files.
 class AnalysisDriver {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 483;
+  static const int DATA_VERSION = 484;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 00bd9e7..37df019 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
 
 export 'package:analyzer/src/dart/ast/constant_evaluator.dart';
@@ -546,11 +545,7 @@
     } else if (identical(node.defaultValue, _oldNode)) {
       node.defaultValue = _newNode as ExpressionImpl;
       var parameterElement = node.declaredFragment;
-      if (parameterElement is DefaultParameterFragmentImpl) {
-        parameterElement.constantInitializer = _newNode;
-      } else if (parameterElement is DefaultFieldFormalParameterElementImpl) {
-        parameterElement.constantInitializer = _newNode;
-      }
+      parameterElement?.constantInitializer = _newNode;
       return true;
     }
     return visitNode(node);
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 5bb736a..40fa444 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -93,24 +93,22 @@
 
     var library = constant.library as LibraryElementImpl;
     if (constant is FormalParameterFragmentImpl) {
-      if (constant is ConstVariableFragment) {
-        var defaultValue = constant.constantInitializer;
-        if (defaultValue != null) {
-          var diagnosticListener = RecordingDiagnosticListener();
-          var diagnosticReporter = DiagnosticReporter(
-            diagnosticListener,
-            constant.source!,
-          );
-          var constantVisitor = ConstantVisitor(
-            this,
-            library,
-            diagnosticReporter,
-          );
-          var dartConstant = constantVisitor.evaluateConstant(defaultValue);
-          constant.evaluationResult = dartConstant;
-        } else {
-          constant.evaluationResult = _nullObject(library);
-        }
+      var defaultValue = constant.constantInitializer;
+      if (defaultValue != null) {
+        var diagnosticListener = RecordingDiagnosticListener();
+        var diagnosticReporter = DiagnosticReporter(
+          diagnosticListener,
+          constant.source!,
+        );
+        var constantVisitor = ConstantVisitor(
+          this,
+          library,
+          diagnosticReporter,
+        );
+        var dartConstant = constantVisitor.evaluateConstant(defaultValue);
+        constant.evaluationResult = dartConstant;
+      } else {
+        constant.evaluationResult = _nullObject(library);
       }
     } else if (constant is VariableFragmentImpl) {
       var constantInitializer = constant.constantInitializer;
diff --git a/pkg/analyzer/lib/src/dart/constant/utilities.dart b/pkg/analyzer/lib/src/dart/constant/utilities.dart
index f902e30..83c201b 100644
--- a/pkg/analyzer/lib/src/dart/constant/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/constant/utilities.dart
@@ -198,10 +198,9 @@
                 !element.isStatic)) {
       constantsToCompute.add(element);
       // Fill error nodes.
-      if (element is ConstVariableFragment) {
-        var constElement = element as ConstVariableFragment;
+      if (element.constantInitializer case var constantInitializer?) {
         configuration.addErrorNode(
-          fromElement: constElement.constantInitializer,
+          fromElement: constantInitializer,
           fromAst: node.initializer,
         );
       }
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 68a90ec..7e17af2 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -62,8 +62,8 @@
 
 // TODO(fshcheglov): Remove after third_party/pkg/dartdoc stops using it.
 // https://github.com/dart-lang/dartdoc/issues/4066
-@Deprecated('Use ConstVariableFragment instead')
-typedef ConstVariableElement = ConstVariableFragment;
+@Deprecated('Use VariableFragmentImpl instead')
+typedef ConstVariableElement = VariableFragmentImpl;
 
 abstract class AnnotatableElementImpl implements ElementImpl, Annotatable {
   @override
@@ -481,24 +481,17 @@
           var formalParameterElements = <FormalParameterElementImpl>[];
           var superInvocationArguments = <ExpressionImpl>[];
           for (var superFormalParameter in superConstructor.formalParameters) {
-            FormalParameterFragmentImpl formalParameterFragment;
-            if (superFormalParameter.firstFragment
-                case ConstVariableFragment constVariable) {
-              // TODO(scheglov): Maybe stop making this distinction
-              formalParameterFragment = DefaultParameterFragmentImpl(
+            var formalParameterFragment = FormalParameterFragmentImpl(
                 nameOffset: -1,
                 name2: superFormalParameter.name3,
                 nameOffset2: null,
                 parameterKind: superFormalParameter.parameterKind,
-              )..constantInitializer = constVariable.constantInitializer;
-            } else {
-              formalParameterFragment = FormalParameterFragmentImpl(
-                nameOffset: -1,
-                name2: superFormalParameter.name3,
-                nameOffset2: null,
-                parameterKind: superFormalParameter.parameterKind,
-              );
-            }
+              )
+              ..constantInitializer =
+                  superFormalParameter
+                      .baseElement
+                      .firstFragment
+                      .constantInitializer;
 
             formalParameterFragment.isConst = superFormalParameter.isConst;
             formalParameterFragment.isFinal = superFormalParameter.isFinal;
@@ -734,8 +727,7 @@
 
 /// A `LocalVariableElement` for a local 'const' variable that has an
 /// initializer.
-class ConstLocalVariableFragmentImpl extends LocalVariableFragmentImpl
-    with ConstVariableFragment {
+class ConstLocalVariableFragmentImpl extends LocalVariableFragmentImpl {
   /// Initialize a newly created local variable element to have the given [name]
   /// and [offset].
   ConstLocalVariableFragmentImpl({
@@ -1139,179 +1131,6 @@
   }
 }
 
-/// Mixin used by elements that represent constant variables and have
-/// initializers.
-///
-/// Note that in correct Dart code, all constant variables must have
-/// initializers.  However, analyzer also needs to handle incorrect Dart code,
-/// in which case there might be some constant variables that lack initializers.
-/// This interface is only used for constant variables that have initializers.
-///
-/// This class is not intended to be part of the public API for analyzer.
-mixin ConstVariableFragment implements FragmentImpl, ConstantEvaluationTarget {
-  /// If this element represents a constant variable, and it has an initializer,
-  /// a copy of the initializer for the constant.  Otherwise `null`.
-  ///
-  /// Note that in correct Dart code, all constant variables must have
-  /// initializers.  However, analyzer also needs to handle incorrect Dart code,
-  /// in which case there might be some constant variables that lack
-  /// initializers.
-  ExpressionImpl? constantInitializer;
-
-  Constant? _evaluationResult;
-
-  Constant? get evaluationResult => _evaluationResult;
-
-  set evaluationResult(Constant? evaluationResult) {
-    _evaluationResult = evaluationResult;
-  }
-
-  @override
-  bool get isConstantEvaluated => _evaluationResult != null;
-
-  /// Return a representation of the value of this variable, forcing the value
-  /// to be computed if it had not previously been computed, or `null` if either
-  /// this variable was not declared with the 'const' modifier or if the value
-  /// of this variable could not be computed because of errors.
-  DartObject? computeConstantValue() {
-    if (evaluationResult == null) {
-      var library = this.library;
-      // TODO(scheglov): https://github.com/dart-lang/sdk/issues/47915
-      if (library == null) {
-        throw StateError(
-          '[library: null][this: ($runtimeType) $this]'
-          '[enclosingElement: $enclosingElement3]',
-        );
-      }
-      computeConstants(
-        declaredVariables: context.declaredVariables,
-        constants: [this],
-        featureSet: library.featureSet,
-        configuration: ConstantEvaluationConfiguration(),
-      );
-    }
-
-    if (evaluationResult case DartObjectImpl result) {
-      return result;
-    }
-    return null;
-  }
-}
-
-/// A [FieldFormalParameterFragmentImpl] for parameters that have an initializer.
-class DefaultFieldFormalParameterElementImpl
-    extends FieldFormalParameterFragmentImpl
-    with ConstVariableFragment {
-  /// Initialize a newly created parameter element to have the given [name] and
-  /// [nameOffset].
-  DefaultFieldFormalParameterElementImpl({
-    required super.nameOffset,
-    required super.name2,
-    required super.nameOffset2,
-    required super.parameterKind,
-  });
-
-  @override
-  String? get defaultValueCode {
-    return constantInitializer?.toSource();
-  }
-}
-
-/// A [FormalParameterFragmentImpl] for parameters that have an initializer.
-class DefaultParameterFragmentImpl extends FormalParameterFragmentImpl
-    with ConstVariableFragment {
-  /// Initialize a newly created parameter element to have the given [name] and
-  /// [nameOffset].
-  DefaultParameterFragmentImpl({
-    required super.nameOffset,
-    required super.name2,
-    required super.nameOffset2,
-    required super.parameterKind,
-  });
-
-  @override
-  String? get defaultValueCode {
-    return constantInitializer?.toSource();
-  }
-}
-
-class DefaultSuperFormalParameterElementImpl
-    extends SuperFormalParameterFragmentImpl
-    with ConstVariableFragment {
-  /// Initialize a newly created parameter element to have the given [name] and
-  /// [nameOffset].
-  DefaultSuperFormalParameterElementImpl({
-    required super.nameOffset,
-    required super.name2,
-    required super.nameOffset2,
-    required super.parameterKind,
-  });
-
-  @override
-  String? get defaultValueCode {
-    if (isRequired) {
-      return null;
-    }
-
-    var constantInitializer = this.constantInitializer;
-    if (constantInitializer != null) {
-      return constantInitializer.toSource();
-    }
-
-    if (_superConstructorParameterDefaultValue != null) {
-      return superConstructorParameter?.defaultValueCode;
-    }
-
-    return null;
-  }
-
-  @override
-  Constant? get evaluationResult {
-    if (constantInitializer != null) {
-      return super.evaluationResult;
-    }
-
-    var superConstructorParameter = this.superConstructorParameter?.baseElement;
-    if (superConstructorParameter is FormalParameterElementImpl) {
-      return superConstructorParameter.firstFragment.evaluationResult;
-    }
-
-    return null;
-  }
-
-  DartObject? get _superConstructorParameterDefaultValue {
-    var superDefault = superConstructorParameter?.computeConstantValue();
-    if (superDefault == null) {
-      return null;
-    }
-
-    // TODO(scheglov): eliminate this cast
-    superDefault as DartObjectImpl;
-    var superDefaultType = superDefault.type;
-
-    var typeSystem = library?.typeSystem;
-    if (typeSystem == null) {
-      return null;
-    }
-
-    var requiredType = type.extensionTypeErasure;
-    if (typeSystem.isSubtypeOf(superDefaultType, requiredType)) {
-      return superDefault;
-    }
-
-    return null;
-  }
-
-  @override
-  DartObject? computeConstantValue() {
-    if (constantInitializer != null) {
-      return super.computeConstantValue();
-    }
-
-    return _superConstructorParameterDefaultValue;
-  }
-}
-
 /// This mixin is used to set up loading class members from summaries only when
 /// they are requested. The summary reader uses [deferReadMembers], and
 /// getters invoke [ensureReadMembers].
@@ -3021,7 +2840,6 @@
 }
 
 class FieldFragmentImpl extends PropertyInducingFragmentImpl
-    with ConstVariableFragment
     implements FieldFragment {
   /// True if this field inherits from a covariant parameter. This happens
   /// when it overrides a field in a supertype that is covariant.
@@ -3424,7 +3242,9 @@
   FormalParameterFragmentImpl get declaration => this;
 
   @override
-  String? get defaultValueCode => null;
+  String? get defaultValueCode {
+    return constantInitializer?.toSource();
+  }
 
   @override
   FormalParameterElementImpl get element {
@@ -8994,9 +8814,6 @@
   }
 
   @override
-  bool get isConstantEvaluated => true;
-
-  @override
   bool get isLate {
     return hasModifier(Modifier.LATE);
   }
@@ -9283,9 +9100,41 @@
   });
 
   @override
+  String? get defaultValueCode {
+    if (isRequired) {
+      return null;
+    }
+
+    var constantInitializer = this.constantInitializer;
+    if (constantInitializer != null) {
+      return constantInitializer.toSource();
+    }
+
+    if (_superConstructorParameterDefaultValue != null) {
+      return superConstructorParameter?.defaultValueCode;
+    }
+
+    return null;
+  }
+
+  @override
   SuperFormalParameterElementImpl get element =>
       super.element as SuperFormalParameterElementImpl;
 
+  @override
+  Constant? get evaluationResult {
+    if (constantInitializer != null) {
+      return super.evaluationResult;
+    }
+
+    var superConstructorParameter = this.superConstructorParameter?.baseElement;
+    if (superConstructorParameter is FormalParameterElementImpl) {
+      return superConstructorParameter.firstFragment.evaluationResult;
+    }
+
+    return null;
+  }
+
   /// Super parameters are visible only in the initializer list scope,
   /// and introduce final variables.
   @override
@@ -9332,6 +9181,38 @@
     return null;
   }
 
+  DartObject? get _superConstructorParameterDefaultValue {
+    var superDefault = superConstructorParameter?.computeConstantValue();
+    if (superDefault == null) {
+      return null;
+    }
+
+    // TODO(scheglov): eliminate this cast
+    superDefault as DartObjectImpl;
+    var superDefaultType = superDefault.type;
+
+    var typeSystem = library?.typeSystem;
+    if (typeSystem == null) {
+      return null;
+    }
+
+    var requiredType = type.extensionTypeErasure;
+    if (typeSystem.isSubtypeOf(superDefaultType, requiredType)) {
+      return superDefault;
+    }
+
+    return null;
+  }
+
+  @override
+  DartObject? computeConstantValue() {
+    if (constantInitializer != null) {
+      return super.computeConstantValue();
+    }
+
+    return _superConstructorParameterDefaultValue;
+  }
+
   /// Return the index of this super-formal parameter among other super-formals.
   int indexIn(ConstructorFragmentImpl enclosingElement) {
     return enclosingElement.parameters
@@ -9549,7 +9430,6 @@
 }
 
 class TopLevelVariableFragmentImpl extends PropertyInducingFragmentImpl
-    with ConstVariableFragment
     implements TopLevelVariableFragment {
   @override
   late TopLevelVariableElementImpl element;
@@ -10390,14 +10270,11 @@
     implements
         VariableElementOrMember,
         AnnotatableFragmentImpl,
+        ConstantEvaluationTarget,
         VariableFragment {
   /// The type of this variable.
   TypeImpl? _type;
 
-  /// Initialize a newly created variable element to have the given [name] and
-  /// [offset].
-  VariableFragmentImpl({required super.nameOffset});
-
   /// If this element represents a constant variable, and it has an initializer,
   /// a copy of the initializer for the constant.  Otherwise `null`.
   ///
@@ -10405,7 +10282,17 @@
   /// initializers.  However, analyzer also needs to handle incorrect Dart code,
   /// in which case there might be some constant variables that lack
   /// initializers.
-  ExpressionImpl? get constantInitializer => null;
+  ExpressionImpl? constantInitializer;
+
+  /// The result of evaluating [constantInitializer].
+  ///
+  /// Is `null` if [constantInitializer] is `null`, or if the value could not
+  /// be computed because of errors.
+  Constant? evaluationResult;
+
+  /// Initialize a newly created variable element to have the given [name] and
+  /// [offset].
+  VariableFragmentImpl({required super.nameOffset});
 
   @override
   VariableFragmentImpl get declaration => this;
@@ -10416,18 +10303,6 @@
   @override
   VariableElementImpl get element;
 
-  /// Return the result of evaluating this variable's initializer as a
-  /// compile-time constant expression, or `null` if this variable is not a
-  /// 'const' variable, if it does not have an initializer, or if the
-  /// compilation unit containing the variable has not been resolved.
-  Constant? get evaluationResult => null;
-
-  /// Set the result of evaluating this variable's initializer as a compile-time
-  /// constant expression to the given [result].
-  set evaluationResult(Constant? result) {
-    throw StateError("Invalid attempt to set a compile-time constant result");
-  }
-
   @override
   bool get hasImplicitType {
     return hasModifier(Modifier.IMPLICIT_TYPE);
@@ -10459,7 +10334,7 @@
   }
 
   @override
-  bool get isConstantEvaluated => true;
+  bool get isConstantEvaluated => evaluationResult != null;
 
   /// Set whether this variable is external.
   set isExternal(bool isExternal) {
@@ -10503,8 +10378,31 @@
     builder.writeVariableElement(this);
   }
 
+  /// Return a representation of the value of this variable, forcing the value
+  /// to be computed if it had not previously been computed, or `null` if either
+  /// this variable was not declared with the 'const' modifier or if the value
+  /// of this variable could not be computed because of errors.
   @override
-  DartObject? computeConstantValue() => null;
+  DartObject? computeConstantValue() {
+    if (evaluationResult == null) {
+      var library = this.library;
+      // TODO(scheglov): https://github.com/dart-lang/sdk/issues/47915
+      if (library == null) {
+        return null;
+      }
+      computeConstants(
+        declaredVariables: context.declaredVariables,
+        constants: [this],
+        featureSet: library.featureSet,
+        configuration: ConstantEvaluationConfiguration(),
+      );
+    }
+
+    if (evaluationResult case DartObjectImpl result) {
+      return result;
+    }
+    return null;
+  }
 }
 
 mixin WrappedElementMixin implements ElementImpl {
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index a34a69f..ffc49aa 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -444,7 +444,7 @@
       var nameOffset2 = nameToken?.offset;
       if (node.parameter is FieldFormalParameter) {
         // Only for recovery, this should not happen in valid code.
-        fragment = DefaultFieldFormalParameterElementImpl(
+        fragment = FieldFormalParameterFragmentImpl(
           nameOffset: nameOffset2 ?? -1,
           parameterKind: node.kind,
           name2: name2,
@@ -452,14 +452,14 @@
         )..constantInitializer = node.defaultValue;
       } else if (node.parameter is SuperFormalParameter) {
         // Only for recovery, this should not happen in valid code.
-        fragment = DefaultSuperFormalParameterElementImpl(
+        fragment = SuperFormalParameterFragmentImpl(
           nameOffset: nameOffset2 ?? -1,
           parameterKind: node.kind,
           name2: name2,
           nameOffset2: nameOffset2,
         )..constantInitializer = node.defaultValue;
       } else {
-        fragment = DefaultParameterFragmentImpl(
+        fragment = FormalParameterFragmentImpl(
           nameOffset: nameOffset2 ?? -1,
           parameterKind: node.kind,
           name2: name2,
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 6db82dd..85d8787 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -2392,7 +2392,7 @@
       popRewrite();
     }
 
-    if (fragment is DefaultParameterFragmentImpl && node.isOfLocalFunction) {
+    if (node.isOfLocalFunction) {
       fragment.constantInitializer = defaultValue;
     }
   }
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index 9780536..62fdeaf 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -450,7 +450,7 @@
     );
 
     var nonDefaultElement = parameter.declaredFragment!;
-    var fragment = DefaultParameterFragmentImpl(
+    var fragment = FormalParameterFragmentImpl(
       nameOffset: nonDefaultElement.nameOffset,
       name2: nonDefaultElement.name2,
       nameOffset2: nonDefaultElement.nameOffset2,
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 4c15f88..3abe553 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -736,13 +736,7 @@
       _readTypeParameters2(unitElement, reader, parameter.typeParameters);
       _readFormalParameters2(unitElement, reader, parameter.parameters);
       parameter.type = reader.readRequiredType();
-      if (parameter is ConstVariableFragment) {
-        var defaultParameter = parameter as ConstVariableFragment;
-        var initializer = reader.readOptionalExpression();
-        if (initializer != null) {
-          defaultParameter.constantInitializer = initializer;
-        }
-      }
+      parameter.constantInitializer = reader.readOptionalExpression();
       if (parameter is FieldFormalParameterFragmentImpl) {
         // TODO(scheglov): use element
         parameter.field =
@@ -1050,7 +1044,6 @@
     return _reader.readTypedList(() {
       var id = _readFragmentId();
       var fragmentName = _readFragmentName();
-      var isDefault = _reader.readBool();
       var isInitializingFormal = _reader.readBool();
       var isSuperFormal = _reader.readBool();
 
@@ -1058,52 +1051,27 @@
       var kind = ResolutionReader._formalParameterKind(kindIndex);
 
       FormalParameterFragmentImpl element;
-      if (!isDefault) {
-        if (isInitializingFormal) {
-          element = FieldFormalParameterFragmentImpl(
-            nameOffset: -1,
-            name2: fragmentName,
-            nameOffset2: null,
-            parameterKind: kind,
-          );
-        } else if (isSuperFormal) {
-          element = SuperFormalParameterFragmentImpl(
-            nameOffset: -1,
-            name2: fragmentName,
-            nameOffset2: null,
-            parameterKind: kind,
-          );
-        } else {
-          element = FormalParameterFragmentImpl(
-            nameOffset: -1,
-            name2: fragmentName,
-            nameOffset2: null,
-            parameterKind: kind,
-          );
-        }
+      if (isInitializingFormal) {
+        element = FieldFormalParameterFragmentImpl(
+          nameOffset: -1,
+          name2: fragmentName,
+          nameOffset2: null,
+          parameterKind: kind,
+        );
+      } else if (isSuperFormal) {
+        element = SuperFormalParameterFragmentImpl(
+          nameOffset: -1,
+          name2: fragmentName,
+          nameOffset2: null,
+          parameterKind: kind,
+        );
       } else {
-        if (isInitializingFormal) {
-          element = DefaultFieldFormalParameterElementImpl(
-            nameOffset: -1,
-            name2: fragmentName,
-            nameOffset2: null,
-            parameterKind: kind,
-          );
-        } else if (isSuperFormal) {
-          element = DefaultSuperFormalParameterElementImpl(
-            nameOffset: -1,
-            name2: fragmentName,
-            nameOffset2: null,
-            parameterKind: kind,
-          );
-        } else {
-          element = DefaultParameterFragmentImpl(
-            nameOffset: -1,
-            name2: fragmentName,
-            nameOffset2: null,
-            parameterKind: kind,
-          );
-        }
+        element = FormalParameterFragmentImpl(
+          nameOffset: -1,
+          name2: fragmentName,
+          nameOffset2: null,
+          parameterKind: kind,
+        );
       }
       idFragmentMap[id] = element;
       ParameterElementFlags.read(_reader, element);
@@ -1801,55 +1769,36 @@
     return readTypedList(() {
       var kindIndex = _reader.readByte();
       var kind = _formalParameterKind(kindIndex);
-      var isDefault = _reader.readBool();
       var hasImplicitType = _reader.readBool();
       var isInitializingFormal = _reader.readBool();
       var typeParameters = _readTypeParameters(unitElement);
       var type = readRequiredType();
       var name = _readFragmentName();
-      if (!isDefault) {
-        FormalParameterFragmentImpl element;
-        if (isInitializingFormal) {
-          element = FieldFormalParameterFragmentImpl(
-            nameOffset: -1,
-            name2: name,
-            nameOffset2: null,
-            parameterKind: kind,
-          )..type = type;
-        } else {
-          element = FormalParameterFragmentImpl(
-            nameOffset: -1,
-            name2: name,
-            nameOffset2: null,
-            parameterKind: kind,
-          )..type = type;
-        }
-        element.hasImplicitType = hasImplicitType;
-        element.typeParameters = typeParameters;
-        element.parameters = _readFormalParameters(unitElement);
-        // TODO(scheglov): reuse for formal parameters
-        _localElements.length -= typeParameters.length;
-        if (unitElement != null) {
-          element.metadata = _readMetadata(unitElement: unitElement);
-        }
-        return element;
-      } else {
-        var element = DefaultParameterFragmentImpl(
+      FormalParameterFragmentImpl element;
+      if (isInitializingFormal) {
+        element = FieldFormalParameterFragmentImpl(
           nameOffset: -1,
           name2: name,
           nameOffset2: null,
           parameterKind: kind,
         )..type = type;
-        element.hasImplicitType = hasImplicitType;
-        element.typeParameters = typeParameters;
-        element.parameters = _readFormalParameters(unitElement);
-        // TODO(scheglov): reuse for formal parameters
-        _localElements.length -= typeParameters.length;
-        if (unitElement != null) {
-          element.metadata = _readMetadata(unitElement: unitElement);
-        }
-        return element;
+      } else {
+        element = FormalParameterFragmentImpl(
+          nameOffset: -1,
+          name2: name,
+          nameOffset2: null,
+          parameterKind: kind,
+        )..type = type;
       }
+      element.hasImplicitType = hasImplicitType;
+      element.typeParameters = typeParameters;
+      element.parameters = _readFormalParameters(unitElement);
+      // TODO(scheglov): reuse for formal parameters
+      _localElements.length -= typeParameters.length;
+      if (unitElement != null) {
+        element.metadata = _readMetadata(unitElement: unitElement);
+      }
+      return element;
     });
   }
 
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index 145df80..2efdfa1 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -629,7 +629,6 @@
   void _writeParameterElement(FormalParameterFragmentImpl element) {
     _writeFragmentId(element);
     _writeFragmentName(element);
-    _sink.writeBool(element is ConstVariableFragment);
     _sink.writeBool(element.isInitializingFormal);
     _sink.writeBool(element.isSuperFormal);
     _sink._writeFormalParameterKind(element);
@@ -640,11 +639,8 @@
     _writeTypeParameters(element.typeParameters, () {
       _writeList(element.parameters, _writeParameterElement);
       _resolutionSink.writeType(element.type);
+      _resolutionSink._writeOptionalNode(element.constantInitializer);
 
-      if (element is ConstVariableFragment) {
-        var constElement = element as ConstVariableFragment;
-        _resolutionSink._writeOptionalNode(constElement.constantInitializer);
-      }
       if (element is FieldFormalParameterFragmentImpl) {
         // TODO(scheglov): formal parameter types? Anything else?
         // _resolutionSink.writeFragmentOrMember(element.field);
@@ -1002,7 +998,6 @@
     writeUInt30(parameters.length);
     for (var parameter in parameters) {
       _writeFormalParameterKind(parameter);
-      writeBool(parameter is ConstVariableFragment);
       writeBool(parameter.hasImplicitType);
       writeBool(parameter.isInitializingFormal);
       _writeTypeParameters(parameter.typeParameters, () {
diff --git a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
index 149f8ce..6980385 100644
--- a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
@@ -41,11 +41,12 @@
     FormalParameterFragmentImpl element,
   ) {
     var node = _linker.getLinkingNode(element);
-    if (node is DefaultFormalParameterImpl && node.defaultValue != null) {
-      return node;
-    } else {
-      return null;
+    if (node?.parent case DefaultFormalParameterImpl defaultParent) {
+      if (defaultParent.defaultValue != null) {
+        return defaultParent;
+      }
     }
+    return null;
   }
 
   void _executable(_Context context, ExecutableFragmentImpl element) {
diff --git a/pkg/analyzer/lib/src/summary2/detach_nodes.dart b/pkg/analyzer/lib/src/summary2/detach_nodes.dart
index 7652999..9114ebb 100644
--- a/pkg/analyzer/lib/src/summary2/detach_nodes.dart
+++ b/pkg/analyzer/lib/src/summary2/detach_nodes.dart
@@ -108,19 +108,15 @@
   void _detachConstVariable(Object element) {
     if (element is VariableElementImpl) {
       for (var fragment in element.fragments) {
-        if (fragment case ConstVariableFragment fragment) {
-          var initializer = fragment.constantInitializer;
-          if (initializer is ExpressionImpl) {
-            _detachNode(initializer);
+        fragment as VariableFragmentImpl;
+        var initializer = fragment.constantInitializer;
+        if (initializer is ExpressionImpl) {
+          _detachNode(initializer);
 
-            initializer = replaceNotSerializableNode(initializer);
-            fragment.constantInitializer = initializer;
+          initializer = replaceNotSerializableNode(initializer);
+          fragment.constantInitializer = initializer;
 
-            ConstantContextForExpressionImpl(
-              fragment as VariableFragmentImpl,
-              initializer,
-            );
-          }
+          ConstantContextForExpressionImpl(fragment, initializer);
         }
       }
       element.resetConstantInitializer();
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 4c86d41..6d954c5 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -1320,27 +1320,17 @@
     var name2 = _getFragmentName(nameToken);
     var nameOffset2 = nameToken.offset.nullIfNegative;
 
-    FormalParameterFragmentImpl fragment;
-    var parent = node.parent;
-    if (parent is DefaultFormalParameterImpl) {
-      fragment = DefaultFieldFormalParameterElementImpl(
-        nameOffset: nameOffset2 ?? -1,
-        name2: name2,
-        nameOffset2: nameOffset2,
-        parameterKind: node.kind,
-      )..constantInitializer = parent.defaultValue;
-      _linker.elementNodes[fragment] = parent;
-      var refName = node.isNamed ? name2 : null;
-      _enclosingContext.addParameter(refName, fragment);
-    } else {
-      fragment = FieldFormalParameterFragmentImpl(
-        nameOffset: nameOffset2 ?? -1,
-        name2: name2,
-        nameOffset2: nameOffset2,
-        parameterKind: node.kind,
-      );
-      _linker.elementNodes[fragment] = node;
-      _enclosingContext.addParameter(null, fragment);
+    var fragment = FieldFormalParameterFragmentImpl(
+      nameOffset: nameOffset2 ?? -1,
+      name2: name2,
+      nameOffset2: nameOffset2,
+      parameterKind: node.kind,
+    );
+    _linker.elementNodes[fragment] = node;
+    _enclosingContext.addParameter(null, fragment);
+
+    if (node.parent case DefaultFormalParameterImpl parent) {
+      fragment.constantInitializer = parent.defaultValue;
     }
 
     fragment.nameOffset2 = _getFragmentNameOffset(nameToken);
@@ -1497,25 +1487,19 @@
     var name2 = _getFragmentName(nameToken);
     var nameOffset2 = nameToken.offset.nullIfNegative;
 
-    FormalParameterFragmentImpl fragment;
-    var parent = node.parent;
-    if (parent is DefaultFormalParameterImpl) {
-      fragment = DefaultParameterFragmentImpl(
-        nameOffset: nameOffset2 ?? -1,
-        name2: name2,
-        nameOffset2: nameOffset2,
-        parameterKind: node.kind,
-      )..constantInitializer = parent.defaultValue;
-      _linker.elementNodes[fragment] = parent;
-    } else {
-      fragment = FormalParameterFragmentImpl(
-        nameOffset: nameOffset2 ?? -1,
-        name2: name2,
-        nameOffset2: nameOffset2,
-        parameterKind: node.kind,
-      );
-      _linker.elementNodes[fragment] = node;
+    var fragment = FormalParameterFragmentImpl(
+      nameOffset: nameOffset2 ?? -1,
+      name2: name2,
+      nameOffset2: nameOffset2,
+      parameterKind: node.kind,
+    );
+    _linker.elementNodes[fragment] = node;
+    _enclosingContext.addParameter(null, fragment);
+
+    if (node.parent case DefaultFormalParameterImpl parent) {
+      fragment.constantInitializer = parent.defaultValue;
     }
+
     fragment.nameOffset2 = _getFragmentNameOffset(nameToken);
     fragment.isExplicitlyCovariant = node.covariantKeyword != null;
     fragment.isFinal = node.isFinal;
@@ -1523,9 +1507,6 @@
     _setCodeRange(fragment, node);
 
     node.declaredFragment = fragment;
-    _linker.elementNodes[fragment] = node;
-    var refName = node.isNamed ? name2 : null;
-    _enclosingContext.addParameter(refName, fragment);
 
     var holder = _EnclosingContext(
       instanceElementBuilder: null,
@@ -1816,28 +1797,19 @@
     var name2 = _getFragmentName(nameToken);
     var nameOffset2 = nameToken?.offset;
 
-    FormalParameterFragmentImpl fragment;
-    var parent = node.parent;
-    if (parent is DefaultFormalParameterImpl &&
-        _enclosingContext.hasDefaultFormalParameters) {
-      fragment = DefaultParameterFragmentImpl(
-        nameOffset: nameOffset2 ?? -1,
-        name2: name2,
-        nameOffset2: nameOffset2,
-        parameterKind: node.kind,
-      )..constantInitializer = parent.defaultValue;
-      _linker.elementNodes[fragment] = parent;
-      var refName = node.isNamed ? name2 : null;
-      _enclosingContext.addParameter(refName, fragment);
-    } else {
-      fragment = FormalParameterFragmentImpl(
-        nameOffset: nameOffset2 ?? -1,
-        name2: name2,
-        nameOffset2: nameOffset2,
-        parameterKind: node.kind,
-      );
-      _linker.elementNodes[fragment] = node;
-      _enclosingContext.addParameter(null, fragment);
+    var fragment = FormalParameterFragmentImpl(
+      nameOffset: nameOffset2 ?? -1,
+      name2: name2,
+      nameOffset2: nameOffset2,
+      parameterKind: node.kind,
+    );
+    _linker.elementNodes[fragment] = node;
+    _enclosingContext.addParameter(null, fragment);
+
+    if (_enclosingContext.hasDefaultFormalParameters) {
+      if (node.parent case DefaultFormalParameterImpl parent) {
+        fragment.constantInitializer = parent.defaultValue;
+      }
     }
 
     fragment.nameOffset2 = _getFragmentNameOffset(nameToken);
@@ -1858,28 +1830,19 @@
     var name2 = _getFragmentName(nameToken);
     var nameOffset2 = nameToken.offset.nullIfNegative;
 
-    SuperFormalParameterFragmentImpl fragment;
-    var parent = node.parent;
-    if (parent is DefaultFormalParameterImpl) {
-      fragment = DefaultSuperFormalParameterElementImpl(
-        nameOffset: nameOffset2 ?? -1,
-        name2: name2,
-        nameOffset2: nameOffset2,
-        parameterKind: node.kind,
-      )..constantInitializer = parent.defaultValue;
-      _linker.elementNodes[fragment] = parent;
-      var refName = node.isNamed ? name2 : null;
-      _enclosingContext.addParameter(refName, fragment);
-    } else {
-      fragment = SuperFormalParameterFragmentImpl(
-        nameOffset: nameOffset2 ?? -1,
-        name2: name2,
-        nameOffset2: nameOffset2,
-        parameterKind: node.kind,
-      );
-      _linker.elementNodes[fragment] = node;
-      _enclosingContext.addParameter(null, fragment);
+    var fragment = SuperFormalParameterFragmentImpl(
+      nameOffset: nameOffset2 ?? -1,
+      name2: name2,
+      nameOffset2: nameOffset2,
+      parameterKind: node.kind,
+    );
+    _linker.elementNodes[fragment] = node;
+    _enclosingContext.addParameter(null, fragment);
+
+    if (node.parent case DefaultFormalParameterImpl parent) {
+      fragment.constantInitializer = parent.defaultValue;
     }
+
     fragment.nameOffset2 = _getFragmentNameOffset(nameToken);
     fragment.hasImplicitType = node.type == null && node.parameters == null;
     fragment.metadata = _buildMetadata(node.metadata);
@@ -2205,8 +2168,8 @@
 
   /// Not all optional formal parameters can have default values.
   /// For example, formal parameters of methods can, but formal parameters
-  /// of function types - not. This flag specifies if we should create
-  /// [FormalParameterFragmentImpl]s or [DefaultParameterFragmentImpl]s.
+  /// of function types - not. This flag specifies if we should store
+  /// the default value into [FormalParameterFragmentImpl]s.
   final bool hasDefaultFormalParameters;
 
   _EnclosingContext({
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index 392a35b..647580a 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -1935,7 +1935,7 @@
   void applyToConstantInitializer(FragmentImpl element) {
     if (element is FieldFragmentImpl && element.isEnumConstant) {
       _applyToEnumConstantInitializer(element);
-    } else if (element is ConstVariableFragment) {
+    } else if (element is VariableFragmentImpl) {
       element.constantInitializer?.accept(this);
     }
   }
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index f62d727..046494f 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -84,7 +84,7 @@
   int _nextUnnamedId = 0;
 
   /// The fields that were speculatively created as [FieldFragmentImpl],
-  /// but we want to clear [ConstVariableFragment.constantInitializer] for it
+  /// but we want to clear [VariableFragmentImpl.constantInitializer] for it
   /// if the class will not end up with a `const` constructor. We don't know
   /// at the time when we create them, because of future augmentations.
   final Set<FieldFragmentImpl> finalInstanceFields = Set.identity();
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index fcc3b40..4e5bfcd 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -65,9 +65,7 @@
       return;
     }
 
-    var constElement = element.ifTypeOrNull<ConstVariableFragment>();
-    if (constElement == null) return;
-    if (constElement.constantInitializer == null) return;
+    if (element.constantInitializer == null) return;
 
     var variable = linker.getLinkingNode(element);
     if (variable is! VariableDeclarationImpl) return;
@@ -86,7 +84,7 @@
     );
 
     // We could have rewritten the initializer.
-    constElement.constantInitializer = variable.initializer;
+    element.constantInitializer = variable.initializer;
   }
 }
 
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 84e6c7c..b5f150e 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
@@ -1143,7 +1143,7 @@
   }
 
   FormalParameterElement _namedParameter(String name, TypeImpl type) {
-    var fragment = DefaultParameterFragmentImpl(
+    var fragment = FormalParameterFragmentImpl(
       nameOffset: 0,
       name2: name,
       nameOffset2: 0,
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index 3832d89..113869f 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -5406,7 +5406,7 @@
     return result;
   }
 
-  DartObjectImpl? _evaluationResult(ConstVariableFragment element) {
+  DartObjectImpl? _evaluationResult(VariableFragmentImpl element) {
     var evaluationResult = element.evaluationResult;
     switch (evaluationResult) {
       case null:
@@ -5420,19 +5420,19 @@
 
   DartObjectImpl? _field(String variableName) {
     var element = findElement2.field(variableName);
-    var constFragment = element.firstFragment as ConstVariableFragment;
+    var constFragment = element.firstFragment as VariableFragmentImpl;
     return _evaluationResult(constFragment);
   }
 
   DartObjectImpl? _localVar(String variableName) {
     var element = findElement2.localVar(variableName);
-    var constFragment = element.firstFragment as ConstVariableFragment;
+    var constFragment = element.firstFragment as VariableFragmentImpl;
     return _evaluationResult(constFragment);
   }
 
   DartObjectImpl? _topLevelVar(String variableName) {
     var element = findElement2.topVar(variableName);
-    var constFragment = element.firstFragment as ConstVariableFragment;
+    var constFragment = element.firstFragment as VariableFragmentImpl;
     return _evaluationResult(constFragment);
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/constant_test.dart b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
index 8d716a6..f59b134 100644
--- a/pkg/analyzer/test/src/dart/resolution/constant_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
@@ -41,7 +41,7 @@
     var aLib = findElement2.import('package:test/a.dart').importedLibrary2!;
     var aConstructor = aLib.getClass2('A')!.constructors.single;
     var p = aConstructor.formalParameters.single;
-    var pf = p.firstFragment as DefaultParameterFragmentImpl;
+    var pf = p.firstFragment as FormalParameterFragmentImpl;
 
     // To evaluate `const A()` we have to evaluate `{int p}`.
     // Even if its value is `null`.
@@ -281,7 +281,7 @@
     assertErrorsInResolvedUnit(result, []);
 
     var bElement = findElement2.field('b');
-    var bFragment = bElement.firstFragment as ConstVariableFragment;
+    var bFragment = bElement.firstFragment as VariableFragmentImpl;
     var bValue = bFragment.evaluationResult as DartObjectImpl;
     var superFields = bValue.getField(GenericState.SUPERCLASS_FIELD);
     expect(superFields!.getField('f1')!.toBoolValue(), false);
diff --git a/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart b/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
index f19c1da..28ec5ff 100644
--- a/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
@@ -277,7 +277,7 @@
 ''');
 
     var vg = findNode.simple('a;').element as PropertyAccessorElement;
-    var v = vg.variable3!.firstFragment as ConstVariableFragment;
+    var v = vg.variable3!.firstFragment as VariableFragmentImpl;
 
     var creation = v.constantInitializer as InstanceCreationExpression;
     return creation;
diff --git a/pkg/analyzer/test/src/summary/elements/metadata_test.dart b/pkg/analyzer/test/src/summary/elements/metadata_test.dart
index c6a0491..38150e4 100644
--- a/pkg/analyzer/test/src/summary/elements/metadata_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/metadata_test.dart
@@ -2358,7 +2358,7 @@
               initializer: expression_1
                 NullLiteral
                   literal: null @28
-                  staticType: null
+                  staticType: Null
   topLevelVariables
     const hasInitializer a
       reference: <testLibrary>::@topLevelVariable::a
diff --git a/tools/VERSION b/tools/VERSION
index 38730c8..46d096a 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 3
 MINOR 9
 PATCH 0
-PRERELEASE 289
+PRERELEASE 290
 PRERELEASE_PATCH 0