diff --git a/pkg/_fe_analyzer_shared/analysis_options.yaml b/pkg/_fe_analyzer_shared/analysis_options.yaml
index 9021253..661360d6 100644
--- a/pkg/_fe_analyzer_shared/analysis_options.yaml
+++ b/pkg/_fe_analyzer_shared/analysis_options.yaml
@@ -18,3 +18,4 @@
     - package_api_docs
     - lines_longer_than_80_chars
     # - always_specify_types
+    - use_super_parameters
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index 654ab4a..d91b11e 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -1032,6 +1032,10 @@
 class FlowAnalysisDebug<Node extends Object, Statement extends Node,
         Expression extends Object, Variable extends Object, Type extends Object>
     implements FlowAnalysis<Node, Statement, Expression, Variable, Type> {
+  static int _nextCallbackId = 0;
+
+  static Expando<String> _description = new Expando<String>();
+
   FlowAnalysis<Node, Statement, Expression, Variable, Type> _wrapped;
 
   bool _exceptionOccurred = false;
@@ -1538,16 +1542,18 @@
 
   @override
   Map<Type, NonPromotionReason> Function() whyNotPromoted(Expression target) {
-    return _wrap(
-        'whyNotPromoted($target)', () => _wrapped.whyNotPromoted(target),
+    return _wrap('whyNotPromoted($target)',
+        () => _trackWhyNotPromoted(_wrapped.whyNotPromoted(target)),
         isQuery: true);
   }
 
   @override
   Map<Type, NonPromotionReason> Function() whyNotPromotedImplicitThis(
       Type staticType) {
-    return _wrap('whyNotPromotedImplicitThis($staticType)',
-        () => _wrapped.whyNotPromotedImplicitThis(staticType),
+    return _wrap(
+        'whyNotPromotedImplicitThis($staticType)',
+        () => _trackWhyNotPromoted(
+            _wrapped.whyNotPromotedImplicitThis(staticType)),
         isQuery: true);
   }
 
@@ -1561,6 +1567,19 @@
   @override
   void _dumpState() => _wrapped._dumpState();
 
+  /// Wraps [callback] so that when it is called, the call (and its return
+  /// value) will be printed to the console.  Also registers the wrapped
+  /// callback in [_description] so that it will be given a unique identifier
+  /// when printed to the console.
+  Map<Type, NonPromotionReason> Function() _trackWhyNotPromoted(
+      Map<Type, NonPromotionReason> Function() callback) {
+    String callbackToString = '#CALLBACK${_nextCallbackId++}';
+    Map<Type, NonPromotionReason> Function() wrappedCallback =
+        () => _wrap('$callbackToString()', callback, isQuery: true);
+    _description[wrappedCallback] = callbackToString;
+    return wrappedCallback;
+  }
+
   T _wrap<T>(String description, T callback(),
       {bool isQuery: false, bool? isPure}) {
     isPure ??= isQuery;
@@ -1578,10 +1597,18 @@
       _wrapped._dumpState();
     }
     if (isQuery) {
-      print('  => $result');
+      print('  => ${_describe(result)}');
     }
     return result;
   }
+
+  static String _describe(Object? value) {
+    if (value != null && value is! String && value is! num && value is! bool) {
+      String? description = _description[value];
+      if (description != null) return description;
+    }
+    return value.toString();
+  }
 }
 
 /// An instance of the [FlowModel] class represents the information gathered by
@@ -2613,6 +2640,9 @@
   final Type type;
 
   ReferenceWithType(this.reference, this.type);
+
+  @override
+  String toString() => 'ReferenceWithType($reference, $type)';
 }
 
 /// Data structure representing a unique value that a variable might take on
@@ -2859,6 +2889,9 @@
     if (nonPromotionHistory != null) {
       parts.add('nonPromotionHistory: $nonPromotionHistory');
     }
+    if (properties.isNotEmpty) {
+      parts.add('properties: $properties');
+    }
     return 'VariableModel(${parts.join(', ')})';
   }
 
@@ -3358,6 +3391,9 @@
   }
 
   @override
+  String toString() => 'VariableReference($variable)';
+
+  @override
   VariableModel<Variable, Type>? _getInfo(
           Map<Variable?, VariableModel<Variable, Type>> variableInfo) =>
       variableInfo[variable];
@@ -3371,7 +3407,7 @@
   /// Flow models associated with the condition being asserted.
   ExpressionInfo<Variable, Type>? _conditionInfo;
 
-  _AssertContext(FlowModel<Variable, Type> previous) : super(previous);
+  _AssertContext(super.previous);
 
   @override
   String toString() =>
@@ -3424,8 +3460,7 @@
   /// circumstance where the "then" branch is taken.
   ExpressionInfo<Variable, Type>? _thenInfo;
 
-  _ConditionalContext(ExpressionInfo<Variable, Type> conditionInfo)
-      : super(conditionInfo);
+  _ConditionalContext(ExpressionInfo<Variable, Type> super.conditionInfo);
 
   @override
   String toString() => '_ConditionalContext(conditionInfo: $_conditionInfo, '
@@ -4353,8 +4388,7 @@
 /// [_FlowContext] representing a function expression.
 class _FunctionExpressionContext<Variable extends Object, Type extends Object>
     extends _SimpleContext<Variable, Type> {
-  _FunctionExpressionContext(FlowModel<Variable, Type> previous)
-      : super(previous);
+  _FunctionExpressionContext(super.previous);
 
   @override
   String toString() => '_FunctionExpressionContext(previous: $_previous)';
@@ -4367,8 +4401,7 @@
   /// statement executes, in the circumstance where the "then" branch is taken.
   FlowModel<Variable, Type>? _afterThen;
 
-  _IfContext(ExpressionInfo<Variable, Type> conditionInfo)
-      : super(conditionInfo);
+  _IfContext(ExpressionInfo<Variable, Type> super.conditionInfo);
 
   @override
   String toString() =>
@@ -4378,8 +4411,7 @@
 /// [_FlowContext] representing an "if-null" (`??`) expression.
 class _IfNullExpressionContext<Variable extends Object, Type extends Object>
     extends _SimpleContext<Variable, Type> {
-  _IfNullExpressionContext(FlowModel<Variable, Type> previous)
-      : super(previous);
+  _IfNullExpressionContext(super.previous);
 
   @override
   String toString() => '_IfNullExpressionContext(previous: $_previous)';
@@ -4396,9 +4428,8 @@
   /// expression.
   final AssignedVariablesNodeInfo<Variable> _assignedVariablesInfoForRhs;
 
-  _LegacyBinaryAndContext(Map<Variable, Type> previousKnownTypes,
-      this._lhsShownTypes, this._assignedVariablesInfoForRhs)
-      : super(previousKnownTypes);
+  _LegacyBinaryAndContext(super.previousKnownTypes, this._lhsShownTypes,
+      this._assignedVariablesInfoForRhs);
 }
 
 /// Contextual information tracked by legacy type promotion about a statement or
@@ -4947,7 +4978,7 @@
 /// [_FlowContext] representing a null aware access (`?.`).
 class _NullAwareAccessContext<Variable extends Object, Type extends Object>
     extends _SimpleContext<Variable, Type> {
-  _NullAwareAccessContext(FlowModel<Variable, Type> previous) : super(previous);
+  _NullAwareAccessContext(super.previous);
 
   @override
   String toString() => '_NullAwareAccessContext(previous: $_previous)';
@@ -5031,6 +5062,10 @@
   }
 
   @override
+  String toString() =>
+      '_PropertyGetReference($target, $propertyName, $propertyMember)';
+
+  @override
   VariableModel<Variable, Type>? _getInfo(
       Map<Variable?, VariableModel<Variable, Type>> variableInfo) {
     VariableModel<Variable, Type> targetInfo = target.getInfo(variableInfo);
@@ -5064,8 +5099,7 @@
   /// after evaluation of the switch expression.
   final FlowModel<Variable, Type> _previous;
 
-  _SimpleStatementContext(Reachability checkpoint, this._previous)
-      : super(checkpoint);
+  _SimpleStatementContext(super.checkpoint, this._previous);
 
   @override
   String toString() => '_SimpleStatementContext(breakModel: $_breakModel, '
@@ -5146,7 +5180,7 @@
   /// has finished executing.
   FlowModel<Variable, Type>? _afterBodyAndCatches;
 
-  _TryContext(FlowModel<Variable, Type> previous) : super(previous);
+  _TryContext(super.previous);
 
   @override
   String toString() =>
@@ -5160,7 +5194,7 @@
   /// block.
   late final FlowModel<Variable, Type> _beforeFinally;
 
-  _TryFinallyContext(FlowModel<Variable, Type> previous) : super(previous);
+  _TryFinallyContext(super.previous);
 }
 
 /// [_FlowContext] representing a `while` loop (or a C-style `for` loop, which
@@ -5170,8 +5204,7 @@
   /// Flow models associated with the loop condition.
   final ExpressionInfo<Variable, Type> _conditionInfo;
 
-  _WhileContext(Reachability checkpoint, this._conditionInfo)
-      : super(checkpoint);
+  _WhileContext(super.checkpoint, this._conditionInfo);
 
   @override
   String toString() => '_WhileContext(breakModel: $_breakModel, '
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/api/code.dart b/pkg/_fe_analyzer_shared/lib/src/macros/api/code.dart
index fc67ba8..9ae76ec 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/api/code.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/api/code.dart
@@ -27,9 +27,9 @@
   @override
   CodeKind get kind => CodeKind.declaration;
 
-  DeclarationCode.fromString(String code) : super.fromString(code);
+  DeclarationCode.fromString(super.code) : super.fromString();
 
-  DeclarationCode.fromParts(List<Object> parts) : super.fromParts(parts);
+  DeclarationCode.fromParts(super.parts) : super.fromParts();
 }
 
 /// A piece of code representing a syntactically valid expression.
@@ -37,9 +37,9 @@
   @override
   CodeKind get kind => CodeKind.expression;
 
-  ExpressionCode.fromString(String code) : super.fromString(code);
+  ExpressionCode.fromString(super.code) : super.fromString();
 
-  ExpressionCode.fromParts(List<Object> parts) : super.fromParts(parts);
+  ExpressionCode.fromParts(super.parts) : super.fromParts();
 }
 
 /// A piece of code representing a syntactically valid function body.
@@ -52,9 +52,9 @@
   @override
   CodeKind get kind => CodeKind.functionBody;
 
-  FunctionBodyCode.fromString(String code) : super.fromString(code);
+  FunctionBodyCode.fromString(super.code) : super.fromString();
 
-  FunctionBodyCode.fromParts(List<Object> parts) : super.fromParts(parts);
+  FunctionBodyCode.fromParts(super.parts) : super.fromParts();
 }
 
 /// A piece of code identifying a syntactically valid function or function type
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/builder_impls.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/builder_impls.dart
index f830cde..6272069 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/builder_impls.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/builder_impls.dart
@@ -43,8 +43,7 @@
 }
 
 class TypeBuilderImpl extends TypeBuilderBase implements TypeBuilder {
-  TypeBuilderImpl(IdentifierResolver identifierResolver)
-      : super(identifierResolver);
+  TypeBuilderImpl(super.identifierResolver);
 
   @override
   void declareType(String name, DeclarationCode typeDeclaration) {
@@ -60,13 +59,9 @@
   final TypeDeclarationResolver typeDeclarationResolver;
   final TypeResolver typeResolver;
 
-  DeclarationBuilderBase(IdentifierResolver identifierResolver,
-      this.typeIntrospector, this.typeDeclarationResolver, this.typeResolver,
-      {Map<String, List<DeclarationCode>>? parentClassAugmentations,
-      List<DeclarationCode>? parentLibraryAugmentations})
-      : super(identifierResolver,
-            parentClassAugmentations: parentClassAugmentations,
-            parentLibraryAugmentations: parentLibraryAugmentations);
+  DeclarationBuilderBase(super.identifierResolver, this.typeIntrospector,
+      this.typeDeclarationResolver, this.typeResolver,
+      {super.parentClassAugmentations, super.parentLibraryAugmentations});
 
   @override
   Future<TypeDeclaration> declarationOf(IdentifierImpl identifier) =>
@@ -94,13 +89,8 @@
 
 class DeclarationBuilderImpl extends DeclarationBuilderBase
     implements DeclarationBuilder {
-  DeclarationBuilderImpl(
-      IdentifierResolver identifierResolver,
-      TypeIntrospector typeIntrospector,
-      TypeDeclarationResolver typeDeclarationResolver,
-      TypeResolver typeResolver)
-      : super(identifierResolver, typeIntrospector, typeDeclarationResolver,
-            typeResolver);
+  DeclarationBuilderImpl(super.identifierResolver, super.typeIntrospector,
+      super.typeDeclarationResolver, super.typeResolver);
 
   @override
   void declareInLibrary(DeclarationCode declaration) {
@@ -134,18 +124,9 @@
     implements TypeInferrer {
   final TypeInferrer typeInferrer;
 
-  DefinitionBuilderBase(
-      IdentifierResolver identifierResolver,
-      TypeIntrospector typeIntrospector,
-      TypeDeclarationResolver typeDeclarationResolver,
-      TypeResolver typeResolver,
-      this.typeInferrer,
-      {Map<String, List<DeclarationCode>>? parentClassAugmentations,
-      List<DeclarationCode>? parentLibraryAugmentations})
-      : super(identifierResolver, typeIntrospector, typeDeclarationResolver,
-            typeResolver,
-            parentClassAugmentations: parentClassAugmentations,
-            parentLibraryAugmentations: parentLibraryAugmentations);
+  DefinitionBuilderBase(super.identifierResolver, super.typeIntrospector,
+      super.typeDeclarationResolver, super.typeResolver, this.typeInferrer,
+      {super.parentClassAugmentations, super.parentLibraryAugmentations});
 
   @override
   Future<TypeAnnotation> inferType(OmittedTypeAnnotationImpl omittedType) =>
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/introspection_impls.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/introspection_impls.dart
index 903c48c..f001456 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/introspection_impls.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/introspection_impls.dart
@@ -62,11 +62,11 @@
   RemoteInstanceKind get kind => RemoteInstanceKind.namedTypeAnnotation;
 
   NamedTypeAnnotationImpl({
-    required int id,
-    required bool isNullable,
+    required super.id,
+    required super.isNullable,
     required this.identifier,
     required this.typeArguments,
-  }) : super(id: id, isNullable: isNullable);
+  });
 
   @override
   void serialize(Serializer serializer) {
@@ -120,13 +120,13 @@
   RemoteInstanceKind get kind => RemoteInstanceKind.functionTypeAnnotation;
 
   FunctionTypeAnnotationImpl({
-    required int id,
-    required bool isNullable,
+    required super.id,
+    required super.isNullable,
     required this.namedParameters,
     required this.positionalParameters,
     required this.returnType,
     required this.typeParameters,
-  }) : super(id: id, isNullable: isNullable);
+  });
 
   @override
   void serialize(Serializer serializer) {
@@ -158,8 +158,7 @@
 
 class OmittedTypeAnnotationImpl extends TypeAnnotationImpl
     implements OmittedTypeAnnotation {
-  OmittedTypeAnnotationImpl({required int id})
-      : super(id: id, isNullable: false);
+  OmittedTypeAnnotationImpl({required super.id}) : super(isNullable: false);
 
   @override
   TypeAnnotationCode get code => new OmittedTypeAnnotationCode(this);
@@ -198,12 +197,12 @@
   RemoteInstanceKind get kind => RemoteInstanceKind.parameterDeclaration;
 
   ParameterDeclarationImpl({
-    required int id,
-    required IdentifierImpl identifier,
+    required super.id,
+    required super.identifier,
     required this.isNamed,
     required this.isRequired,
     required this.type,
-  }) : super(id: id, identifier: identifier);
+  });
 
   @override
   void serialize(Serializer serializer) {
@@ -276,10 +275,10 @@
   RemoteInstanceKind get kind => RemoteInstanceKind.typeParameterDeclaration;
 
   TypeParameterDeclarationImpl({
-    required int id,
-    required IdentifierImpl identifier,
+    required super.id,
+    required super.identifier,
     required this.bound,
-  }) : super(id: id, identifier: identifier);
+  });
 
   @override
   void serialize(Serializer serializer) {
@@ -333,8 +332,8 @@
   RemoteInstanceKind get kind => RemoteInstanceKind.functionDeclaration;
 
   FunctionDeclarationImpl({
-    required int id,
-    required IdentifierImpl identifier,
+    required super.id,
+    required super.identifier,
     required this.isAbstract,
     required this.isExternal,
     required this.isGetter,
@@ -344,7 +343,7 @@
     required this.positionalParameters,
     required this.returnType,
     required this.typeParameters,
-  }) : super(id: id, identifier: identifier);
+  });
 
   @override
   void serialize(Serializer serializer) {
@@ -391,34 +390,22 @@
 
   MethodDeclarationImpl({
     // Declaration fields
-    required int id,
-    required IdentifierImpl identifier,
+    required super.id,
+    required super.identifier,
     // Function fields
-    required bool isAbstract,
-    required bool isExternal,
-    required bool isGetter,
-    required bool isOperator,
-    required bool isSetter,
-    required List<ParameterDeclarationImpl> namedParameters,
-    required List<ParameterDeclarationImpl> positionalParameters,
-    required TypeAnnotationImpl returnType,
-    required List<TypeParameterDeclarationImpl> typeParameters,
+    required super.isAbstract,
+    required super.isExternal,
+    required super.isGetter,
+    required super.isOperator,
+    required super.isSetter,
+    required super.namedParameters,
+    required super.positionalParameters,
+    required super.returnType,
+    required super.typeParameters,
     // Method fields
     required this.definingClass,
     required this.isStatic,
-  }) : super(
-          id: id,
-          identifier: identifier,
-          isAbstract: isAbstract,
-          isExternal: isExternal,
-          isGetter: isGetter,
-          isOperator: isOperator,
-          isSetter: isSetter,
-          namedParameters: namedParameters,
-          positionalParameters: positionalParameters,
-          returnType: returnType,
-          typeParameters: typeParameters,
-        );
+  });
 
   @override
   void serialize(Serializer serializer) {
@@ -441,35 +428,23 @@
 
   ConstructorDeclarationImpl({
     // Declaration fields
-    required int id,
-    required IdentifierImpl identifier,
+    required super.id,
+    required super.identifier,
     // Function fields
-    required bool isAbstract,
-    required bool isExternal,
-    required bool isGetter,
-    required bool isOperator,
-    required bool isSetter,
-    required List<ParameterDeclarationImpl> namedParameters,
-    required List<ParameterDeclarationImpl> positionalParameters,
-    required TypeAnnotationImpl returnType,
-    required List<TypeParameterDeclarationImpl> typeParameters,
+    required super.isAbstract,
+    required super.isExternal,
+    required super.isGetter,
+    required super.isOperator,
+    required super.isSetter,
+    required super.namedParameters,
+    required super.positionalParameters,
+    required super.returnType,
+    required super.typeParameters,
     // Method fields
-    required IdentifierImpl definingClass,
+    required super.definingClass,
     // Constructor fields
     required this.isFactory,
   }) : super(
-          id: id,
-          identifier: identifier,
-          isAbstract: isAbstract,
-          isExternal: isExternal,
-          isGetter: isGetter,
-          isOperator: isOperator,
-          isSetter: isSetter,
-          namedParameters: namedParameters,
-          positionalParameters: positionalParameters,
-          returnType: returnType,
-          typeParameters: typeParameters,
-          definingClass: definingClass,
           isStatic: true,
         );
 
@@ -501,13 +476,13 @@
   RemoteInstanceKind get kind => RemoteInstanceKind.variableDeclaration;
 
   VariableDeclarationImpl({
-    required int id,
-    required IdentifierImpl identifier,
+    required super.id,
+    required super.identifier,
     required this.isExternal,
     required this.isFinal,
     required this.isLate,
     required this.type,
-  }) : super(id: id, identifier: identifier);
+  });
 
   @override
   void serialize(Serializer serializer) {
@@ -533,23 +508,17 @@
 
   FieldDeclarationImpl({
     // Declaration fields
-    required int id,
-    required IdentifierImpl identifier,
+    required super.id,
+    required super.identifier,
     // Variable fields
-    required bool isExternal,
-    required bool isFinal,
-    required bool isLate,
-    required TypeAnnotationImpl type,
+    required super.isExternal,
+    required super.isFinal,
+    required super.isLate,
+    required super.type,
     // Field fields
     required this.definingClass,
     required this.isStatic,
-  }) : super(
-            id: id,
-            identifier: identifier,
-            isExternal: isExternal,
-            isFinal: isFinal,
-            isLate: isLate,
-            type: type);
+  });
 
   @override
   RemoteInstanceKind get kind => RemoteInstanceKind.fieldDeclaration;
@@ -570,10 +539,10 @@
   final List<TypeParameterDeclarationImpl> typeParameters;
 
   ParameterizedTypeDeclarationImpl({
-    required int id,
-    required IdentifierImpl identifier,
+    required super.id,
+    required super.identifier,
     required this.typeParameters,
-  }) : super(id: id, identifier: identifier);
+  });
 
   void serialize(Serializer serializer) {
     super.serialize(serializer);
@@ -616,17 +585,17 @@
 
   ClassDeclarationImpl({
     // Declaration fields
-    required int id,
-    required IdentifierImpl identifier,
+    required super.id,
+    required super.identifier,
     // TypeDeclaration fields
-    required List<TypeParameterDeclarationImpl> typeParameters,
+    required super.typeParameters,
     // ClassDeclaration fields
     required this.interfaces,
     required this.isAbstract,
     required this.isExternal,
     required this.mixins,
     required this.superclass,
-  }) : super(id: id, identifier: identifier, typeParameters: typeParameters);
+  });
 
   @override
   void serialize(Serializer serializer) {
@@ -661,13 +630,13 @@
 
   TypeAliasDeclarationImpl({
     // Declaration fields
-    required int id,
-    required IdentifierImpl identifier,
+    required super.id,
+    required super.identifier,
     // TypeDeclaration fields
-    required List<TypeParameterDeclarationImpl> typeParameters,
+    required super.typeParameters,
     // TypeAlias fields
     required this.aliasedType,
-  }) : super(id: id, identifier: identifier, typeParameters: typeParameters);
+  });
 
   @override
   void serialize(Serializer serializer) {
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/isolated_executor.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/isolated_executor.dart
index 35facb9..6aefda5 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/isolated_executor.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/isolated_executor.dart
@@ -37,12 +37,10 @@
   final void Function() onClose;
 
   _SingleIsolatedMacroExecutor(
-      {required Stream<Object> messageStream,
+      {required super.messageStream,
       required this.onClose,
       required this.sendPort,
-      required SerializationMode serializationMode})
-      : super(
-            messageStream: messageStream, serializationMode: serializationMode);
+      required super.serializationMode});
 
   static Future<_SingleIsolatedMacroExecutor> start(
       Uri uriToSpawn,
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/process_executor.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/process_executor.dart
index 01d4004..eda515f 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/process_executor.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/process_executor.dart
@@ -44,12 +44,10 @@
   final void Function() onClose;
 
   _SingleProcessMacroExecutor(
-      {required Stream<Object> messageStream,
+      {required super.messageStream,
       required this.onClose,
       required this.outSink,
-      required SerializationMode serializationMode})
-      : super(
-            messageStream: messageStream, serializationMode: serializationMode);
+      required super.serializationMode});
 
   static Future<_SingleProcessMacroExecutor> startWithSocket(
       SerializationMode serializationMode,
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/protocol.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/protocol.dart
index 26c47bf..5cf95cc 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/protocol.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/protocol.dart
@@ -195,14 +195,13 @@
   final Uri library;
   final String name;
 
-  LoadMacroRequest(this.library, this.name, {required int serializationZoneId})
-      : super(serializationZoneId: serializationZoneId);
+  LoadMacroRequest(this.library, this.name,
+      {required super.serializationZoneId});
 
-  LoadMacroRequest.deserialize(
-      Deserializer deserializer, int serializationZoneId)
+  LoadMacroRequest.deserialize(super.deserializer, super.serializationZoneId)
       : library = Uri.parse((deserializer..moveNext()).expectString()),
         name = (deserializer..moveNext()).expectString(),
-        super.deserialize(deserializer, serializationZoneId);
+        super.deserialize();
 
   @override
   void serialize(Serializer serializer) {
@@ -227,17 +226,16 @@
 
   InstantiateMacroRequest(this.library, this.name, this.constructor,
       this.arguments, this.instanceId,
-      {required int serializationZoneId})
-      : super(serializationZoneId: serializationZoneId);
+      {required super.serializationZoneId});
 
   InstantiateMacroRequest.deserialize(
-      Deserializer deserializer, int serializationZoneId)
+      super.deserializer, super.serializationZoneId)
       : library = (deserializer..moveNext()).expectUri(),
         name = (deserializer..moveNext()).expectString(),
         constructor = (deserializer..moveNext()).expectString(),
         arguments = new Arguments.deserialize(deserializer),
         instanceId = (deserializer..moveNext()).expectInt(),
-        super.deserialize(deserializer, serializationZoneId);
+        super.deserialize();
 
   @override
   void serialize(Serializer serializer) {
@@ -260,17 +258,16 @@
 
   ExecuteTypesPhaseRequest(
       this.macro, this.declaration, this.identifierResolver,
-      {required int serializationZoneId})
-      : super(serializationZoneId: serializationZoneId);
+      {required super.serializationZoneId});
 
   /// When deserializing we have already consumed the message type, so we don't
   /// consume it again.
   ExecuteTypesPhaseRequest.deserialize(
-      Deserializer deserializer, int serializationZoneId)
+      super.deserializer, super.serializationZoneId)
       : macro = new MacroInstanceIdentifierImpl.deserialize(deserializer),
         declaration = RemoteInstance.deserialize(deserializer),
         identifierResolver = RemoteInstance.deserialize(deserializer),
-        super.deserialize(deserializer, serializationZoneId);
+        super.deserialize();
 
   void serialize(Serializer serializer) {
     serializer.addInt(MessageType.executeTypesPhaseRequest.index);
@@ -300,20 +297,19 @@
       this.typeDeclarationResolver,
       this.typeResolver,
       this.typeIntrospector,
-      {required int serializationZoneId})
-      : super(serializationZoneId: serializationZoneId);
+      {required super.serializationZoneId});
 
   /// When deserializing we have already consumed the message type, so we don't
   /// consume it again.
   ExecuteDeclarationsPhaseRequest.deserialize(
-      Deserializer deserializer, int serializationZoneId)
+      super.deserializer, super.serializationZoneId)
       : macro = new MacroInstanceIdentifierImpl.deserialize(deserializer),
         declaration = RemoteInstance.deserialize(deserializer),
         identifierResolver = RemoteInstance.deserialize(deserializer),
         typeDeclarationResolver = RemoteInstance.deserialize(deserializer),
         typeResolver = RemoteInstance.deserialize(deserializer),
         typeIntrospector = RemoteInstance.deserialize(deserializer),
-        super.deserialize(deserializer, serializationZoneId);
+        super.deserialize();
 
   void serialize(Serializer serializer) {
     serializer.addInt(MessageType.executeDeclarationsPhaseRequest.index);
@@ -348,13 +344,12 @@
       this.typeIntrospector,
       this.typeDeclarationResolver,
       this.typeInferrer,
-      {required int serializationZoneId})
-      : super(serializationZoneId: serializationZoneId);
+      {required super.serializationZoneId});
 
   /// When deserializing we have already consumed the message type, so we don't
   /// consume it again.
   ExecuteDefinitionsPhaseRequest.deserialize(
-      Deserializer deserializer, int serializationZoneId)
+      super.deserializer, super.serializationZoneId)
       : macro = new MacroInstanceIdentifierImpl.deserialize(deserializer),
         declaration = RemoteInstance.deserialize(deserializer),
         identifierResolver = RemoteInstance.deserialize(deserializer),
@@ -362,7 +357,7 @@
         typeIntrospector = RemoteInstance.deserialize(deserializer),
         typeDeclarationResolver = RemoteInstance.deserialize(deserializer),
         typeInferrer = RemoteInstance.deserialize(deserializer),
-        super.deserialize(deserializer, serializationZoneId);
+        super.deserialize();
 
   void serialize(Serializer serializer) {
     serializer.addInt(MessageType.executeDefinitionsPhaseRequest.index);
@@ -388,15 +383,14 @@
   /// When deserializing we have already consumed the message type, so we don't
   /// consume it again.
   ResolveIdentifierRequest(this.library, this.name, this.identifierResolver,
-      {required int serializationZoneId})
-      : super(serializationZoneId: serializationZoneId);
+      {required super.serializationZoneId});
 
   ResolveIdentifierRequest.deserialize(
-      Deserializer deserializer, int serializationZoneId)
+      super.deserializer, super.serializationZoneId)
       : library = Uri.parse((deserializer..moveNext()).expectString()),
         name = (deserializer..moveNext()).expectString(),
         identifierResolver = RemoteInstance.deserialize(deserializer),
-        super.deserialize(deserializer, serializationZoneId);
+        super.deserialize();
 
   void serialize(Serializer serializer) {
     serializer
@@ -415,16 +409,14 @@
   final RemoteInstanceImpl typeResolver;
 
   ResolveTypeRequest(this.typeAnnotationCode, this.typeResolver,
-      {required int serializationZoneId})
-      : super(serializationZoneId: serializationZoneId);
+      {required super.serializationZoneId});
 
   /// When deserializing we have already consumed the message type, so we don't
   /// consume it again.
-  ResolveTypeRequest.deserialize(
-      Deserializer deserializer, int serializationZoneId)
+  ResolveTypeRequest.deserialize(super.deserializer, super.serializationZoneId)
       : typeAnnotationCode = (deserializer..moveNext()).expectCode(),
         typeResolver = RemoteInstance.deserialize(deserializer),
-        super.deserialize(deserializer, serializationZoneId);
+        super.deserialize();
 
   void serialize(Serializer serializer) {
     serializer.addInt(MessageType.resolveTypeRequest.index);
@@ -440,16 +432,15 @@
   final RemoteInstanceImpl rightType;
 
   IsExactlyTypeRequest(this.leftType, this.rightType,
-      {required int serializationZoneId})
-      : super(serializationZoneId: serializationZoneId);
+      {required super.serializationZoneId});
 
   /// When deserializing we have already consumed the message type, so we don't
   /// consume it again.
   IsExactlyTypeRequest.deserialize(
-      Deserializer deserializer, int serializationZoneId)
+      super.deserializer, super.serializationZoneId)
       : leftType = RemoteInstance.deserialize(deserializer),
         rightType = RemoteInstance.deserialize(deserializer),
-        super.deserialize(deserializer, serializationZoneId);
+        super.deserialize();
 
   void serialize(Serializer serializer) {
     serializer.addInt(MessageType.isExactlyTypeRequest.index);
@@ -465,16 +456,14 @@
   final RemoteInstanceImpl rightType;
 
   IsSubtypeOfRequest(this.leftType, this.rightType,
-      {required int serializationZoneId})
-      : super(serializationZoneId: serializationZoneId);
+      {required super.serializationZoneId});
 
   /// When deserializing we have already consumed the message type, so we don't
   /// consume it again.
-  IsSubtypeOfRequest.deserialize(
-      Deserializer deserializer, int serializationZoneId)
+  IsSubtypeOfRequest.deserialize(super.deserializer, super.serializationZoneId)
       : leftType = RemoteInstance.deserialize(deserializer),
         rightType = RemoteInstance.deserialize(deserializer),
-        super.deserialize(deserializer, serializationZoneId);
+        super.deserialize();
 
   void serialize(Serializer serializer) {
     serializer.addInt(MessageType.isSubtypeOfRequest.index);
@@ -493,8 +482,7 @@
 
   InterfaceIntrospectionRequest(
       this.type, this.typeIntrospector, this.requestKind,
-      {required int serializationZoneId})
-      : super(serializationZoneId: serializationZoneId);
+      {required super.serializationZoneId});
 
   /// When deserializing we have already consumed the message type, so we don't
   /// consume it again and it should instead be passed in here.
@@ -519,16 +507,15 @@
   final RemoteInstanceImpl typeDeclarationResolver;
 
   DeclarationOfRequest(this.identifier, this.typeDeclarationResolver,
-      {required int serializationZoneId})
-      : super(serializationZoneId: serializationZoneId);
+      {required super.serializationZoneId});
 
   /// When deserializing we have already consumed the message type, so we don't
   /// consume it again.
   DeclarationOfRequest.deserialize(
-      Deserializer deserializer, int serializationZoneId)
+      super.deserializer, super.serializationZoneId)
       : identifier = RemoteInstance.deserialize(deserializer),
         typeDeclarationResolver = RemoteInstance.deserialize(deserializer),
-        super.deserialize(deserializer, serializationZoneId);
+        super.deserialize();
 
   @override
   void serialize(Serializer serializer) {
@@ -546,16 +533,14 @@
   final RemoteInstanceImpl typeInferrer;
 
   InferTypeRequest(this.omittedType, this.typeInferrer,
-      {required int serializationZoneId})
-      : super(serializationZoneId: serializationZoneId);
+      {required super.serializationZoneId});
 
   /// When deserializing we have already consumed the message type, so we don't
   /// consume it again.
-  InferTypeRequest.deserialize(
-      Deserializer deserializer, int serializationZoneId)
+  InferTypeRequest.deserialize(super.deserializer, super.serializationZoneId)
       : omittedType = RemoteInstance.deserialize(deserializer),
         typeInferrer = RemoteInstance.deserialize(deserializer),
-        super.deserialize(deserializer, serializationZoneId);
+        super.deserialize();
 
   @override
   void serialize(Serializer serializer) {
@@ -666,13 +651,8 @@
 /// Named variant of the [ClientStaticTypeImpl].
 class ClientNamedStaticTypeImpl extends ClientStaticTypeImpl
     implements NamedStaticType {
-  ClientNamedStaticTypeImpl(
-      Future<Response> Function(Request request) sendRequest,
-      {required RemoteInstanceImpl remoteInstance,
-      required int serializationZoneId})
-      : super(sendRequest,
-            remoteInstance: remoteInstance,
-            serializationZoneId: serializationZoneId);
+  ClientNamedStaticTypeImpl(super.sendRequest,
+      {required super.remoteInstance, required super.serializationZoneId});
 }
 
 /// Client side implementation of the [ClientTypeIntrospector], converts
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart
index 5866409..202dad8 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart
@@ -68,14 +68,12 @@
 
   final String? correctionMessage;
 
-  const MessageCode(String name,
-      {int index: -1,
-      List<String>? analyzerCodes,
-      Severity severity: Severity.error,
+  const MessageCode(super.name,
+      {super.index,
+      super.analyzerCodes,
+      super.severity,
       required this.problemMessage,
-      this.correctionMessage})
-      : super(name,
-            index: index, analyzerCodes: analyzerCodes, severity: severity);
+      this.correctionMessage});
 
   Map<String, dynamic> get arguments => const <String, dynamic>{};
 
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/class_member_parser.dart b/pkg/_fe_analyzer_shared/lib/src/parser/class_member_parser.dart
index d83d3a0..f53db77 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/class_member_parser.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/class_member_parser.dart
@@ -8,8 +8,6 @@
 
 import 'error_delegation_listener.dart' show ErrorDelegationListener;
 
-import 'listener.dart' show Listener;
-
 import 'parser_impl.dart' show Parser;
 
 /// Parser similar to [TopLevelParser] but also parses class members (excluding
@@ -17,10 +15,7 @@
 class ClassMemberParser extends Parser {
   Parser? skipParser;
 
-  ClassMemberParser(Listener listener,
-      {bool useImplicitCreationExpression: true})
-      : super(listener,
-            useImplicitCreationExpression: useImplicitCreationExpression);
+  ClassMemberParser(super.listener, {super.useImplicitCreationExpression});
 
   @override
   Token parseExpression(Token token) {
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart
index 4621543..979d161 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart
@@ -1025,8 +1025,8 @@
 class TopLevelDeclarationIdentifierContext extends IdentifierContext {
   final List<String> followingValues;
 
-  const TopLevelDeclarationIdentifierContext(String name, this.followingValues)
-      : super(name, inDeclaration: true);
+  const TopLevelDeclarationIdentifierContext(super.name, this.followingValues)
+      : super(inDeclaration: true);
 
   @override
   Token ensureIdentifier(Token token, Parser parser) {
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/top_level_parser.dart b/pkg/_fe_analyzer_shared/lib/src/parser/top_level_parser.dart
index 5399b86..14f69b4 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/top_level_parser.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/top_level_parser.dart
@@ -10,14 +10,10 @@
 
 import 'class_member_parser.dart' show ClassMemberParser;
 
-import 'listener.dart' show Listener;
-
 /// Parser which only parses top-level elements, but ignores their bodies.
 /// Use [Parser] to parse everything.
 class TopLevelParser extends ClassMemberParser {
-  TopLevelParser(Listener listener, {bool useImplicitCreationExpression: true})
-      : super(listener,
-            useImplicitCreationExpression: useImplicitCreationExpression);
+  TopLevelParser(super.listener, {super.useImplicitCreationExpression});
 
   @override
   Token parseClassOrMixinOrExtensionBody(Token token, DeclarationKind kind,
diff --git a/pkg/_fe_analyzer_shared/lib/src/scanner/error_token.dart b/pkg/_fe_analyzer_shared/lib/src/scanner/error_token.dart
index 824d170..f8ab292 100644
--- a/pkg/_fe_analyzer_shared/lib/src/scanner/error_token.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/scanner/error_token.dart
@@ -105,7 +105,7 @@
 
 /// Represents an encoding error.
 class EncodingErrorToken extends ErrorToken {
-  EncodingErrorToken(int charOffset) : super(charOffset);
+  EncodingErrorToken(super.charOffset);
 
   String toString() => "EncodingErrorToken()";
 
diff --git a/pkg/_fe_analyzer_shared/lib/src/scanner/errors.dart b/pkg/_fe_analyzer_shared/lib/src/scanner/errors.dart
index 44cdf31..efb594a 100644
--- a/pkg/_fe_analyzer_shared/lib/src/scanner/errors.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/scanner/errors.dart
@@ -184,9 +184,8 @@
    * given [correctionMessage] template.
    */
   const ScannerErrorCode(String name, String problemMessage,
-      {String? correctionMessage})
+      {super.correctionMessage})
       : super(
-          correctionMessage: correctionMessage,
           problemMessage: problemMessage,
           name: name,
           uniqueName: 'ScannerErrorCode.$name',
diff --git a/pkg/_fe_analyzer_shared/lib/src/scanner/reader.dart b/pkg/_fe_analyzer_shared/lib/src/scanner/reader.dart
index 74c76f7..34f1084 100644
--- a/pkg/_fe_analyzer_shared/lib/src/scanner/reader.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/scanner/reader.dart
@@ -124,7 +124,7 @@
    * [sequence]. The [_offsetDelta] is the offset from the beginning of the file
    * to the beginning of the source being scanned
    */
-  SubSequenceReader(String sequence, this._offsetDelta) : super(sequence);
+  SubSequenceReader(super.sequence, this._offsetDelta);
 
   @override
   int get offset => _offsetDelta + super.offset;
diff --git a/pkg/_fe_analyzer_shared/lib/src/scanner/string_scanner.dart b/pkg/_fe_analyzer_shared/lib/src/scanner/string_scanner.dart
index f31fbb1..96f953f 100644
--- a/pkg/_fe_analyzer_shared/lib/src/scanner/string_scanner.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/scanner/string_scanner.dart
@@ -44,10 +44,10 @@
       : string = ensureZeroTermination(string),
         super(configuration, includeComments, languageVersionChanged);
 
-  StringScanner.recoveryOptionScanner(StringScanner copyFrom)
+  StringScanner.recoveryOptionScanner(StringScanner super.copyFrom)
       : string = copyFrom.string,
         scanOffset = copyFrom.scanOffset,
-        super.recoveryOptionScanner(copyFrom);
+        super.recoveryOptionScanner();
 
   StringScanner createRecoveryOptionScanner() {
     return new StringScanner.recoveryOptionScanner(this);
diff --git a/pkg/_fe_analyzer_shared/lib/src/scanner/token.dart b/pkg/_fe_analyzer_shared/lib/src/scanner/token.dart
index 604b880..8b59e48 100644
--- a/pkg/_fe_analyzer_shared/lib/src/scanner/token.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/scanner/token.dart
@@ -78,8 +78,7 @@
    * Initialize a newly created token to represent a token of the given [type]
    * with the given [value] at the given [offset].
    */
-  CommentToken(TokenType type, String value, int offset)
-      : super(type, value, offset);
+  CommentToken(super.type, super.value, super.offset);
 }
 
 /**
@@ -90,8 +89,7 @@
    * Initialize a newly created token to represent a token of the given [type]
    * with the given [value] at the given [offset].
    */
-  DocumentationCommentToken(TokenType type, String value, int offset)
-      : super(type, value, offset);
+  DocumentationCommentToken(super.type, super.value, super.offset);
 }
 
 enum KeywordStyle {
@@ -655,10 +653,8 @@
    * Initialize a newly created token to represent a token of the given [type]
    * with the given [value] at the given [offset].
    */
-  StringToken(TokenType type, String value, int offset,
-      [CommentToken? precedingComment])
-      : _value = StringUtilities.intern(value),
-        super(type, offset, precedingComment);
+  StringToken(super.type, String value, super.offset, [super.precedingComment])
+      : _value = StringUtilities.intern(value);
 
   @override
   bool get isIdentifier => identical(kind, IDENTIFIER_TOKEN);
@@ -678,9 +674,7 @@
    * Initialize a newly created token to have the given [type] at the given
    * [offset].
    */
-  SyntheticBeginToken(TokenType type, int offset,
-      [CommentToken? precedingComment])
-      : super(type, offset, precedingComment);
+  SyntheticBeginToken(super.type, super.offset, [super.precedingComment]);
 
   @override
   Token? beforeSynthetic;
@@ -700,7 +694,7 @@
    * Initialize a newly created token to represent the given [keyword] at the
    * given [offset].
    */
-  SyntheticKeywordToken(Keyword keyword, int offset) : super(keyword, offset);
+  SyntheticKeywordToken(super.keyword, super.offset);
 
   @override
   Token? beforeSynthetic;
@@ -720,8 +714,7 @@
    * with the given [value] at the given [offset]. If the [length] is
    * not specified, then it defaults to the length of [value].
    */
-  SyntheticStringToken(TokenType type, String value, int offset, [this._length])
-      : super(type, value, offset);
+  SyntheticStringToken(super.type, super.value, super.offset, [this._length]);
 
   @override
   Token? beforeSynthetic;
@@ -737,7 +730,7 @@
  * A synthetic token.
  */
 class SyntheticToken extends SimpleToken {
-  SyntheticToken(TokenType type, int offset) : super(type, offset);
+  SyntheticToken(super.type, super.offset);
 
   @override
   Token? beforeSynthetic;
diff --git a/pkg/_fe_analyzer_shared/lib/src/scanner/token_impl.dart b/pkg/_fe_analyzer_shared/lib/src/scanner/token_impl.dart
index 986340a..83f8484 100644
--- a/pkg/_fe_analyzer_shared/lib/src/scanner/token_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/scanner/token_impl.dart
@@ -130,24 +130,23 @@
    * is canonicalized before the token is created.
    */
   CommentTokenImpl.fromSubstring(
-      TokenType type, String data, int start, int end, int charOffset,
-      {bool canonicalize: false})
-      : super.fromSubstring(type, data, start, end, charOffset,
-            canonicalize: canonicalize);
+      super.type, super.data, super.start, super.end, super.charOffset,
+      {super.canonicalize})
+      : super.fromSubstring();
 
   /**
    * Creates a non-lazy comment token.
    */
-  CommentTokenImpl.fromString(TokenType type, String lexeme, int charOffset)
-      : super.fromString(type, lexeme, charOffset);
+  CommentTokenImpl.fromString(super.type, super.lexeme, super.charOffset)
+      : super.fromString();
 
   /**
    * Creates a lazy string token. If [asciiOnly] is false, the byte array
    * is passed through a UTF-8 decoder.
    */
-  CommentTokenImpl.fromUtf8Bytes(TokenType type, List<int> data, int start,
-      int end, bool asciiOnly, int charOffset)
-      : super.fromUtf8Bytes(type, data, start, end, asciiOnly, charOffset);
+  CommentTokenImpl.fromUtf8Bytes(super.type, super.data, super.start, super.end,
+      super.asciiOnly, super.charOffset)
+      : super.fromUtf8Bytes();
 }
 
 class LanguageVersionTokenImpl extends CommentTokenImpl
@@ -181,18 +180,17 @@
    * is canonicalized before the token is created.
    */
   DartDocToken.fromSubstring(
-      TokenType type, String data, int start, int end, int charOffset,
-      {bool canonicalize: false})
-      : super.fromSubstring(type, data, start, end, charOffset,
-            canonicalize: canonicalize);
+      super.type, super.data, super.start, super.end, super.charOffset,
+      {super.canonicalize})
+      : super.fromSubstring();
 
   /**
    * Creates a lazy string token. If [asciiOnly] is false, the byte array
    * is passed through a UTF-8 decoder.
    */
-  DartDocToken.fromUtf8Bytes(TokenType type, List<int> data, int start, int end,
-      bool asciiOnly, int charOffset)
-      : super.fromUtf8Bytes(type, data, start, end, asciiOnly, charOffset);
+  DartDocToken.fromUtf8Bytes(super.type, super.data, super.start, super.end,
+      super.asciiOnly, super.charOffset)
+      : super.fromUtf8Bytes();
 }
 
 /**
diff --git a/pkg/_fe_analyzer_shared/pubspec.yaml b/pkg/_fe_analyzer_shared/pubspec.yaml
index ad5468c..d64e8b8 100644
--- a/pkg/_fe_analyzer_shared/pubspec.yaml
+++ b/pkg/_fe_analyzer_shared/pubspec.yaml
@@ -1,10 +1,10 @@
 name: _fe_analyzer_shared
-version: 40.0.0
+version: 41.0.0
 description: Logic that is shared between the front_end and analyzer packages.
 repository: https://github.com/dart-lang/sdk/tree/main/pkg/_fe_analyzer_shared
 
 environment:
-  sdk: '>=2.12.0 <3.0.0'
+  sdk: '>=2.17.0 <3.0.0'
 
 dependencies:
   meta: ^1.0.2
diff --git a/pkg/_fe_analyzer_shared/test/macros/util.dart b/pkg/_fe_analyzer_shared/test/macros/util.dart
index fea0464..3e68eb6 100644
--- a/pkg/_fe_analyzer_shared/test/macros/util.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/util.dart
@@ -114,17 +114,13 @@
   final ResolvedIdentifier resolved;
 
   TestIdentifier({
-    required int id,
-    required String name,
+    required super.id,
+    required super.name,
     required IdentifierKind kind,
     required Uri uri,
     required String? staticScope,
-  })  : resolved = ResolvedIdentifier(
-            kind: kind, name: name, staticScope: staticScope, uri: uri),
-        super(
-          id: id,
-          name: name,
-        );
+  }) : resolved = ResolvedIdentifier(
+            kind: kind, name: name, staticScope: staticScope, uri: uri);
 }
 
 extension DebugCodeString on Code {
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index ed113f0..f49952a 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,4 +1,4 @@
-## 4.2.0-dev
+## 4.2.0
 * Update SDK constraints to `>=2.17.0 <3.0.0`.
 * Deprecated `ImportDirective.COMPARATOR`, use appropriate custom logic, if necessary.
 * Deprecated `Element.isAccessibleIn()`, use `isAccessibleIn2()` instead.
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 1164841..ffd31fe 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -551,19 +551,8 @@
         !_equalByteLists(_apiSignature, newApiSignature);
     _apiSignature = newApiSignature;
 
-    // The API signature changed.
-    //   Flush affected library cycles.
-    //   Flush exported top-level declarations of all files.
-    if (apiSignatureChanged) {
-      // TODO(scheglov) Make it a method of FileStateKind?
-      final kind = _kind;
-      if (kind is LibraryFileStateKind) {
-        kind._libraryCycle?.invalidate();
-      }
-      _invalidatesLibrariesOfThisPart();
-    }
-
     // It is possible that this file does not reference these files.
+    // TODO(scheglov) This also could be moved, almost.
     _stopReferencingByThisFile();
 
     // Read imports/exports on demand.
@@ -662,27 +651,6 @@
     }
   }
 
-  /// If this is a part, invalidate the libraries that use it.
-  /// TODO(scheglov) Make it a method of `PartFileStateKind`?
-  void _invalidatesLibrariesOfThisPart() {
-    if (_kind is PartFileStateKind) {
-      final libraries = _fsState._pathToFile.values
-          .map((file) => file._kind)
-          .whereType<LibraryFileStateKind>()
-          .toList();
-
-      for (final library in libraries) {
-        for (final partDirective in library.parts) {
-          if (partDirective is PartDirectiveWithFile) {
-            if (partDirective.includedFile == this) {
-              library._libraryCycle?.invalidate();
-            }
-          }
-        }
-      }
-    }
-  }
-
   CompilationUnitImpl _parse(AnalysisErrorListener errorListener) {
     return parse2(errorListener, content);
   }
@@ -778,11 +746,10 @@
         );
       }
     } else if (libraryDirective != null) {
-      final kind = _kind = LibraryFileStateKind(
+      _kind = LibraryFileStateKind(
         file: this,
         name: libraryDirective.name,
       );
-      _fsState._libraryNameToFiles.add(kind);
     } else if (partOfNameDirective != null) {
       _kind = PartOfNameFileStateKind(
         file: this,
@@ -812,8 +779,6 @@
         name: null,
       );
     }
-
-    _invalidatesLibrariesOfThisPart();
   }
 
   static UnlinkedUnit serializeAstUnlinked2(
@@ -1618,7 +1583,9 @@
   LibraryFileStateKind({
     required super.file,
     required this.name,
-  });
+  }) {
+    file._fsState._libraryNameToFiles.add(this);
+  }
 
   /// The list of files files that this library consists of, i.e. this library
   /// file itself, its [parts], and augmentations.
@@ -1925,10 +1892,29 @@
 abstract class PartFileStateKind extends FileStateKind {
   PartFileStateKind({
     required super.file,
-  });
+  }) {
+    _invalidateLibraries();
+  }
+
+  @override
+  void dispose() {
+    _invalidateLibraries();
+    super.dispose();
+  }
 
   /// Returns `true` if the `part of` directive confirms the [library].
   bool isPartOf(LibraryFileStateKind library);
+
+  /// This method is invoked when the part file is updated.
+  /// The file either becomes a part, or might stop being a part.
+  void _invalidateLibraries() {
+    for (final reference in file.referencingFiles) {
+      final referenceKind = reference.kind;
+      if (referenceKind is LibraryFileStateKind) {
+        referenceKind.invalidateLibraryCycle();
+      }
+    }
+  }
 }
 
 /// The file has `part of name` directive.
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 77c258e..da576fd 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 4.2.0-dev
+version: 4.2.0
 description: This package provides a library that performs static analysis of Dart code.
 repository: https://github.com/dart-lang/sdk/tree/main/pkg/analyzer
 
@@ -7,7 +7,7 @@
   sdk: '>=2.17.0 <3.0.0'
 
 dependencies:
-  _fe_analyzer_shared: ^40.0.0
+  _fe_analyzer_shared: ^41.0.0
   collection: ^1.15.0
   convert: ^3.0.0
   crypto: ^3.0.0
diff --git a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
index 5ac5829..ef21d7a 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -4141,7 +4141,7 @@
           library_2 dart:core synthetic
         augmentations
           notAugmentation file_1
-        cycle_0
+        cycle_2
           dependencies: dart:core
           libraries: library_0
           apiSignature_0
@@ -4173,7 +4173,7 @@
           library_2 dart:core synthetic
         augmentations
           notAugmentation file_1
-        cycle_2
+        cycle_3
           dependencies: dart:core
           libraries: library_8
           apiSignature_0
@@ -4211,7 +4211,7 @@
           library_2 dart:core synthetic
         parts
           partOfName_7
-        cycle_3
+        cycle_4
           dependencies: dart:core
           libraries: library_9
           apiSignature_1
@@ -4291,7 +4291,7 @@
           library_2 dart:core synthetic
         augmentations
           notAugmentation file_1
-        cycle_0
+        cycle_2
           dependencies: dart:core
           libraries: library_0
           apiSignature_0
@@ -4321,7 +4321,7 @@
           library_2 dart:core synthetic
         augmentations
           notAugmentation file_1
-        cycle_2
+        cycle_3
           dependencies: dart:core
           libraries: library_8
           apiSignature_0
@@ -4356,7 +4356,7 @@
           library_2 dart:core synthetic
         parts
           partOfUriKnown_7
-        cycle_3
+        cycle_4
           dependencies: dart:core
           libraries: library_9
           apiSignature_1
@@ -4975,7 +4975,6 @@
     // `a.dart` is still a part.
     // ...but the unlinked signature of `a.dart` is different.
     // API signatures of both `b.dart` and `c.dart` changed.
-    // Even though `a.dart` is not a valid part of `c.dart`.
     assertDriverStateString(testFile, r'''
 files
   /home/test/lib/a.dart
diff --git a/pkg/compiler/test/dump_info/data_new/marker.options b/pkg/compiler/test/dump_info/data_new/marker.options
new file mode 100644
index 0000000..b9803ce
--- /dev/null
+++ b/pkg/compiler/test/dump_info/data_new/marker.options
@@ -0,0 +1,2 @@
+spec=pkg/compiler/test/dump_info/dump_info_new_test.dart
+
diff --git a/pkg/compiler/test/dump_info/data_new/mixin_with_tearoff_test.dart b/pkg/compiler/test/dump_info/data_new/mixin_with_tearoff_test.dart
new file mode 100644
index 0000000..b9fea3b
--- /dev/null
+++ b/pkg/compiler/test/dump_info/data_new/mixin_with_tearoff_test.dart
@@ -0,0 +1,400 @@
+//@dart = 2.9
+
+/*library: 
+ constant=[
+  {
+  "id": "constant/B.C_JS_CONST = function getTagFallback(o) {\n  var s = Object.prototype.toString.call(o);\n  return s.substring(8, s.length - 1);\n};\n",
+  "kind": "constant",
+  "name": "",
+  "size": 131,
+  "outputUnit": "outputUnit/main",
+  "code": "B.C_JS_CONST = function getTagFallback(o) {\n  var s = Object.prototype.toString.call(o);\n  return s.substring(8, s.length - 1);\n};\n"
+},
+  {
+  "id": "constant/B.Interceptor_methods = J.Interceptor.prototype;\n",
+  "kind": "constant",
+  "name": "",
+  "size": 49,
+  "outputUnit": "outputUnit/main",
+  "code": "B.Interceptor_methods = J.Interceptor.prototype;\n"
+},
+  {
+  "id": "constant/B.JSArray_methods = J.JSArray.prototype;\n",
+  "kind": "constant",
+  "name": "",
+  "size": 41,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSArray_methods = J.JSArray.prototype;\n"
+},
+  {
+  "id": "constant/B.JSInt_methods = J.JSInt.prototype;\n",
+  "kind": "constant",
+  "name": "",
+  "size": 37,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSInt_methods = J.JSInt.prototype;\n"
+},
+  {
+  "id": "constant/B.JSString_methods = J.JSString.prototype;\n",
+  "kind": "constant",
+  "name": "",
+  "size": 43,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JSString_methods = J.JSString.prototype;\n"
+},
+  {
+  "id": "constant/B.JavaScriptObject_methods = J.JavaScriptObject.prototype;\n",
+  "kind": "constant",
+  "name": "",
+  "size": 59,
+  "outputUnit": "outputUnit/main",
+  "code": "B.JavaScriptObject_methods = J.JavaScriptObject.prototype;\n"
+},
+  {
+  "id": "constant/B.Type_Object_xQ6 = A.typeLiteral(\"Object\");\n",
+  "kind": "constant",
+  "name": "",
+  "size": 45,
+  "outputUnit": "outputUnit/main",
+  "code": "B.Type_Object_xQ6 = A.typeLiteral(\"Object\");\n"
+},
+  {
+  "id": "constant/B.Type_dynamic_0Rz = A.typeLiteral(\"@\");\n",
+  "kind": "constant",
+  "name": "",
+  "size": 41,
+  "outputUnit": "outputUnit/main",
+  "code": "B.Type_dynamic_0Rz = A.typeLiteral(\"@\");\n"
+}],
+ deferredFiles=[{}],
+ dependencies=[{}],
+ library=[{
+  "id": "library/memory:sdk/tests/web/native/main.dart::",
+  "kind": "library",
+  "name": "memory:sdk/tests/web/native/main.dart",
+  "size": 842,
+  "children": [
+    "class/memory:sdk/tests/web/native/main.dart::Clazz",
+    "class/memory:sdk/tests/web/native/main.dart::Mixin",
+    "class/memory:sdk/tests/web/native/main.dart::Subclass",
+    "class/memory:sdk/tests/web/native/main.dart::Super",
+    "function/memory:sdk/tests/web/native/main.dart::main"
+  ],
+  "canonicalUri": "memory:sdk/tests/web/native/main.dart"
+}],
+ outputUnits=[{
+  "id": "outputUnit/main",
+  "kind": "outputUnit",
+  "name": "main",
+  "filename": "out",
+  "imports": []
+}]
+*/
+
+import 'package:expect/expect.dart';
+
+/*class: Super:class=[{
+  "id": "class/memory:sdk/tests/web/native/main.dart::Super",
+  "kind": "class",
+  "name": "Super",
+  "size": 62,
+  "outputUnit": "outputUnit/main",
+  "parent": "library/memory:sdk/tests/web/native/main.dart::",
+  "modifiers": {
+    "abstract": false
+  },
+  "children": []
+}]*/
+class Super<T> {
+  void method(T t) {}
+}
+
+/*class: Mixin:class=[{
+  "id": "class/memory:sdk/tests/web/native/main.dart::Mixin",
+  "kind": "class",
+  "name": "Mixin",
+  "size": 89,
+  "outputUnit": "outputUnit/main",
+  "parent": "library/memory:sdk/tests/web/native/main.dart::",
+  "modifiers": {
+    "abstract": false
+  },
+  "children": [
+    "function/memory:sdk/tests/web/native/main.dart::Mixin.method"
+  ]
+}]*/
+class Mixin {
+  /*member: Mixin.method:
+   function=[{
+  "id": "function/memory:sdk/tests/web/native/main.dart::Mixin.method",
+  "kind": "function",
+  "name": "method",
+  "size": 81,
+  "outputUnit": "outputUnit/main",
+  "parent": "class/memory:sdk/tests/web/native/main.dart::Mixin",
+  "children": [],
+  "modifiers": {
+    "static": false,
+    "const": false,
+    "factory": false,
+    "external": false
+  },
+  "returnType": "void",
+  "inferredReturnType": "[null]",
+  "parameters": [
+    {
+      "name": "t",
+      "type": "[exact=JSUInt31]",
+      "declaredType": "int*"
+    }
+  ],
+  "sideEffects": "SideEffects(reads nothing; writes nothing)",
+  "inlinedCount": 0,
+  "code": "method$1(t) {\n    }\nvar _ = A.Mixin.prototype;\n\n_.super$Mixin$method = _.method$1;\n",
+  "type": "void Function(int*)*",
+  "functionKind": 2
+}],
+   holding=[
+    {"id":"function/dart:_rti::Rti._bind","mask":null},
+    {"id":"function/dart:_rti::Rti._eval","mask":null},
+    {"id":"function/dart:_rti::_arrayInstanceType","mask":null},
+    {"id":"function/dart:_rti::_asBool","mask":null},
+    {"id":"function/dart:_rti::_asBoolQ","mask":null},
+    {"id":"function/dart:_rti::_asBoolS","mask":null},
+    {"id":"function/dart:_rti::_asDouble","mask":null},
+    {"id":"function/dart:_rti::_asDoubleQ","mask":null},
+    {"id":"function/dart:_rti::_asDoubleS","mask":null},
+    {"id":"function/dart:_rti::_asInt","mask":null},
+    {"id":"function/dart:_rti::_asIntQ","mask":null},
+    {"id":"function/dart:_rti::_asIntS","mask":null},
+    {"id":"function/dart:_rti::_asNum","mask":null},
+    {"id":"function/dart:_rti::_asNumQ","mask":null},
+    {"id":"function/dart:_rti::_asNumS","mask":null},
+    {"id":"function/dart:_rti::_asObject","mask":null},
+    {"id":"function/dart:_rti::_asString","mask":null},
+    {"id":"function/dart:_rti::_asStringQ","mask":null},
+    {"id":"function/dart:_rti::_asStringS","mask":null},
+    {"id":"function/dart:_rti::_asTop","mask":null},
+    {"id":"function/dart:_rti::_generalAsCheckImplementation","mask":null},
+    {"id":"function/dart:_rti::_generalIsTestImplementation","mask":null},
+    {"id":"function/dart:_rti::_generalNullableAsCheckImplementation","mask":null},
+    {"id":"function/dart:_rti::_generalNullableIsTestImplementation","mask":null},
+    {"id":"function/dart:_rti::_installSpecializedAsCheck","mask":null},
+    {"id":"function/dart:_rti::_installSpecializedIsTest","mask":null},
+    {"id":"function/dart:_rti::_instanceType","mask":null},
+    {"id":"function/dart:_rti::_isBool","mask":null},
+    {"id":"function/dart:_rti::_isInt","mask":null},
+    {"id":"function/dart:_rti::_isNum","mask":null},
+    {"id":"function/dart:_rti::_isObject","mask":null},
+    {"id":"function/dart:_rti::_isString","mask":null},
+    {"id":"function/dart:_rti::_isTop","mask":null},
+    {"id":"function/dart:_rti::findType","mask":null},
+    {"id":"function/dart:_rti::instanceType","mask":null}]
+  */
+  void method(int t) {}
+}
+
+/*class: Clazz:class=[{
+  "id": "class/memory:sdk/tests/web/native/main.dart::Clazz",
+  "kind": "class",
+  "name": "Clazz",
+  "size": 192,
+  "outputUnit": "outputUnit/main",
+  "parent": "library/memory:sdk/tests/web/native/main.dart::",
+  "modifiers": {
+    "abstract": false
+  },
+  "children": [
+    "function/memory:sdk/tests/web/native/main.dart::Clazz.method"
+  ]
+}]*/
+/*member: Clazz.method:
+ function=[{
+  "id": "function/memory:sdk/tests/web/native/main.dart::Clazz.method",
+  "kind": "function",
+  "name": "method",
+  "size": 162,
+  "outputUnit": "outputUnit/main",
+  "parent": "class/memory:sdk/tests/web/native/main.dart::Clazz",
+  "children": [],
+  "modifiers": {
+    "static": false,
+    "const": false,
+    "factory": false,
+    "external": false
+  },
+  "returnType": "void",
+  "inferredReturnType": "[null]",
+  "parameters": [
+    {
+      "name": "t",
+      "type": "Union([exact=JSString], [exact=JSUInt31])",
+      "declaredType": "int*"
+    }
+  ],
+  "sideEffects": "SideEffects(reads nothing; writes nothing)",
+  "inlinedCount": 1,
+  "code": "method$1(t) {\n      return this.super$Mixin$method(A._asIntS(t));\n    }\n_instance(A.Clazz.prototype, \"get$method\", 0, 1, null, [\"call$1\"], [\"method$1\"], 0, 0, 1);\n",
+  "type": "void Function(int*)*",
+  "functionKind": 2
+}],
+ holding=[
+  {"id":"function/dart:_rti::Rti._bind","mask":null},
+  {"id":"function/dart:_rti::Rti._eval","mask":null},
+  {"id":"function/dart:_rti::_arrayInstanceType","mask":null},
+  {"id":"function/dart:_rti::_asBool","mask":null},
+  {"id":"function/dart:_rti::_asBoolQ","mask":null},
+  {"id":"function/dart:_rti::_asBoolS","mask":null},
+  {"id":"function/dart:_rti::_asDouble","mask":null},
+  {"id":"function/dart:_rti::_asDoubleQ","mask":null},
+  {"id":"function/dart:_rti::_asDoubleS","mask":null},
+  {"id":"function/dart:_rti::_asInt","mask":null},
+  {"id":"function/dart:_rti::_asIntQ","mask":null},
+  {"id":"function/dart:_rti::_asIntS","mask":null},
+  {"id":"function/dart:_rti::_asNum","mask":null},
+  {"id":"function/dart:_rti::_asNumQ","mask":null},
+  {"id":"function/dart:_rti::_asNumS","mask":null},
+  {"id":"function/dart:_rti::_asObject","mask":null},
+  {"id":"function/dart:_rti::_asString","mask":null},
+  {"id":"function/dart:_rti::_asStringQ","mask":null},
+  {"id":"function/dart:_rti::_asStringS","mask":null},
+  {"id":"function/dart:_rti::_asTop","mask":null},
+  {"id":"function/dart:_rti::_generalAsCheckImplementation","mask":null},
+  {"id":"function/dart:_rti::_generalIsTestImplementation","mask":null},
+  {"id":"function/dart:_rti::_generalNullableAsCheckImplementation","mask":null},
+  {"id":"function/dart:_rti::_generalNullableIsTestImplementation","mask":null},
+  {"id":"function/dart:_rti::_installSpecializedAsCheck","mask":null},
+  {"id":"function/dart:_rti::_installSpecializedIsTest","mask":null},
+  {"id":"function/dart:_rti::_instanceType","mask":null},
+  {"id":"function/dart:_rti::_isBool","mask":null},
+  {"id":"function/dart:_rti::_isInt","mask":null},
+  {"id":"function/dart:_rti::_isNum","mask":null},
+  {"id":"function/dart:_rti::_isObject","mask":null},
+  {"id":"function/dart:_rti::_isString","mask":null},
+  {"id":"function/dart:_rti::_isTop","mask":null},
+  {"id":"function/dart:_rti::findType","mask":null},
+  {"id":"function/dart:_rti::instanceType","mask":null},
+  {"id":"function/memory:sdk/tests/web/native/main.dart::Mixin.method","mask":null}]
+*/
+class Clazz = Super<int> with Mixin;
+
+/*class: Subclass:class=[{
+  "id": "class/memory:sdk/tests/web/native/main.dart::Subclass",
+  "kind": "class",
+  "name": "Subclass",
+  "size": 95,
+  "outputUnit": "outputUnit/main",
+  "parent": "library/memory:sdk/tests/web/native/main.dart::",
+  "modifiers": {
+    "abstract": false
+  },
+  "children": [
+    "function/memory:sdk/tests/web/native/main.dart::Subclass.Subclass",
+    "function/memory:sdk/tests/web/native/main.dart::Subclass.test"
+  ]
+}]*/
+/*member: Subclass.:function=[{
+  "id": "function/memory:sdk/tests/web/native/main.dart::Subclass.Subclass",
+  "kind": "function",
+  "name": "Subclass",
+  "size": 0,
+  "outputUnit": "outputUnit/main",
+  "parent": "class/memory:sdk/tests/web/native/main.dart::Subclass",
+  "children": [],
+  "modifiers": {
+    "static": false,
+    "const": false,
+    "factory": false,
+    "external": false
+  },
+  "returnType": "Subclass*",
+  "inferredReturnType": "[exact=Subclass]",
+  "parameters": [],
+  "sideEffects": "SideEffects(reads nothing; writes nothing)",
+  "inlinedCount": 1,
+  "code": "",
+  "type": "Subclass* Function()*",
+  "functionKind": 3
+}]*/
+class Subclass extends Clazz {
+  /*member: Subclass.test:function=[{
+  "id": "function/memory:sdk/tests/web/native/main.dart::Subclass.test",
+  "kind": "function",
+  "name": "test",
+  "size": 0,
+  "outputUnit": "outputUnit/main",
+  "parent": "class/memory:sdk/tests/web/native/main.dart::Subclass",
+  "children": [],
+  "modifiers": {
+    "static": false,
+    "const": false,
+    "factory": false,
+    "external": false
+  },
+  "returnType": "void",
+  "inferredReturnType": "[null]",
+  "parameters": [],
+  "sideEffects": "SideEffects(reads anything; writes anything)",
+  "inlinedCount": 1,
+  "code": "",
+  "type": "void Function()*",
+  "functionKind": 2
+}]*/
+  void test() {
+    void Function(int) f = super.method;
+    f(0);
+  }
+}
+
+/*member: main:
+ closure=[{
+  "id": "closure/memory:sdk/tests/web/native/main.dart::main.main_closure",
+  "kind": "closure",
+  "name": "main_closure",
+  "size": 237,
+  "outputUnit": "outputUnit/main",
+  "parent": "function/memory:sdk/tests/web/native/main.dart::main",
+  "function": "function/memory:sdk/tests/web/native/main.dart::main.main_closure.call"
+}],
+ function=[{
+  "id": "function/memory:sdk/tests/web/native/main.dart::main",
+  "kind": "function",
+  "name": "main",
+  "size": 404,
+  "outputUnit": "outputUnit/main",
+  "parent": "library/memory:sdk/tests/web/native/main.dart::",
+  "children": [
+    "closure/memory:sdk/tests/web/native/main.dart::main.main_closure"
+  ],
+  "modifiers": {
+    "static": false,
+    "const": false,
+    "factory": false,
+    "external": false
+  },
+  "returnType": "dynamic",
+  "inferredReturnType": "[null]",
+  "parameters": [],
+  "sideEffects": "SideEffects(reads anything; writes anything)",
+  "inlinedCount": 0,
+  "code": "main() {\n      var s = new A.Subclass();\n      A.Clazz.prototype.get$method.call(s).call$1(0);\n      A.Expect_throws(new A.main_closure(s), type$.legacy_Object);\n    }",
+  "type": "dynamic Function()*",
+  "functionKind": 0
+}],
+ holding=[
+  {"id":"function/dart:_js_helper::closureFromTearOff","mask":null},
+  {"id":"function/dart:_rti::_setArrayType","mask":null},
+  {"id":"function/dart:_rti::findType","mask":null},
+  {"id":"function/memory:sdk/tests/web/native/main.dart::Clazz.method","mask":null},
+  {"id":"function/memory:sdk/tests/web/native/main.dart::Subclass.Subclass","mask":"inlined"},
+  {"id":"function/memory:sdk/tests/web/native/main.dart::Subclass.Subclass","mask":null},
+  {"id":"function/memory:sdk/tests/web/native/main.dart::Subclass.test","mask":"inlined"},
+  {"id":"function/memory:sdk/tests/web/native/main.dart::Subclass.test","mask":null},
+  {"id":"function/memory:sdk/tests/web/native/main.dart::main.main_closure.call","mask":null},
+  {"id":"function/memory:sdk/tests/web/native/main.dart::main.main_closure.call","mask":null},
+  {"id":"function/package:expect/expect.dart::Expect.throws","mask":null}]
+*/
+main() {
+  Super<Object> s = new Subclass()..test();
+  Expect.throws(() => s.method(''));
+}
diff --git a/pkg/compiler/test/dump_info/dump_info_new_regression_test.dart b/pkg/compiler/test/dump_info/dump_info_new_regression_test.dart
index 42c10b3..baae6e9 100644
--- a/pkg/compiler/test/dump_info/dump_info_new_regression_test.dart
+++ b/pkg/compiler/test/dump_info/dump_info_new_regression_test.dart
@@ -26,10 +26,10 @@
 final JsonEncoder indentedEncoder = const JsonEncoder.withIndent('  ');
 
 String jsonEncode(Map object, {bool indent = true}) {
-  var jsonEncoder = indent ? indentedEncoder : encoder;
-  var transformedObject = transformJsonObjectForComparison(object);
+  final jsonEncoder = indent ? indentedEncoder : encoder;
+  final transformedObject = transformJsonObjectForComparison(object);
   // Filter block comments since they interfere with ID test comments.
-  var json = jsonEncoder
+  final json = jsonEncoder
       .convert(transformedObject)
       .replaceAll('/*', '')
       .replaceAll('*/', '');
@@ -54,7 +54,7 @@
     }
 
     // Ignore sizes for output units, as these deviate by some constant when
-    // `--canary` is enabled.
+    // `--new-dump-info` is enabled.
     if (object['kind'] == 'outputUnit' && key == 'size') {
       return;
     }
@@ -89,12 +89,12 @@
 
   asyncTest(() async {
     Directory dataDir = Directory.fromUri(Platform.script.resolve('data'));
-    print('Testing output of dump-info');
+    print('Testing output of new-dump-info');
     print('==================================================================');
     await checkTests(dataDir, const DumpInfoDataComputer(),
         args: filteredArgs,
         testedConfigs: allSpecConfigs,
-        options: ['--dump-info', '--canary', '--enable-asserts']);
+        options: ['--dump-info', '--new-dump-info', '--enable-asserts']);
   });
 }
 
diff --git a/pkg/compiler/test/dump_info/dump_info_new_test.dart b/pkg/compiler/test/dump_info/dump_info_new_test.dart
new file mode 100644
index 0000000..97c9595
--- /dev/null
+++ b/pkg/compiler/test/dump_info/dump_info_new_test.dart
@@ -0,0 +1,302 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.7
+
+import 'dart:convert';
+import 'dart:io';
+import 'package:_fe_analyzer_shared/src/testing/features.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/dump_info.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/js_model/element_map.dart';
+import 'package:compiler/src/js_model/js_world.dart';
+import 'package:dart2js_info/info.dart' as info;
+import 'package:dart2js_info/json_info_codec.dart' as info;
+import 'package:kernel/ast.dart' as ir;
+import '../equivalence/id_equivalence.dart';
+import '../equivalence/id_equivalence_helper.dart';
+
+final JsonEncoder encoder = const JsonEncoder();
+final JsonEncoder indentedEncoder = const JsonEncoder.withIndent('  ');
+
+String jsonEncode(Map object, {bool indent = true}) {
+  final jsonEncoder = indent ? indentedEncoder : encoder;
+  // Filter block comments since they interfere with ID test comments.
+  final json =
+      jsonEncoder.convert(object).replaceAll('/*', '').replaceAll('*/', '');
+  return json;
+}
+
+Map filteredJsonObject(Map object, Set<String> filteredFields) {
+  Map filteredObject = {};
+  object.forEach((key, value) {
+    if (filteredFields.contains(key)) return;
+    filteredObject[key] = value;
+  });
+  return filteredObject;
+}
+
+main(List<String> args) {
+  asyncTest(() async {
+    Directory dataDir = Directory.fromUri(Platform.script.resolve('data_new'));
+    print('Testing output of new-dump-info');
+    print('==================================================================');
+    await checkTests(dataDir, const DumpInfoDataComputer(),
+        args: args,
+        testedConfigs: allSpecConfigs,
+        options: ['--dump-info', '--new-dump-info', '--enable-asserts']);
+  });
+}
+
+class Tags {
+  static const String library = 'library';
+  static const String clazz = 'class';
+  static const String classType = 'classType';
+  static const String closure = 'closure';
+  static const String function = 'function';
+  static const String typeDef = 'typedef';
+  static const String field = 'field';
+  static const String constant = 'constant';
+  static const String holding = 'holding';
+  static const String dependencies = 'dependencies';
+  static const String outputUnits = 'outputUnits';
+  static const String deferredFiles = 'deferredFiles';
+}
+
+class DumpInfoDataComputer extends DataComputer<Features> {
+  const DumpInfoDataComputer();
+
+  static const String wildcard = '%';
+
+  @override
+  void computeLibraryData(Compiler compiler, LibraryEntity library,
+      Map<Id, ActualData<Features>> actualMap,
+      {bool verbose}) {
+    final converter = info.AllInfoToJsonConverter(isBackwardCompatible: true);
+    DumpInfoStateData dumpInfoState = compiler.dumpInfoStateForTesting;
+
+    final features = Features();
+    final libraryInfo = dumpInfoState.entityToInfo[library];
+    if (libraryInfo == null) return;
+
+    features.addElement(
+        Tags.library, jsonEncode(libraryInfo.accept(converter)));
+
+    // Store program-wide information on the main library.
+    final name = '${library.canonicalUri.pathSegments.last}';
+    if (name.startsWith('main')) {
+      for (final constantInfo in dumpInfoState.info.constants) {
+        features.addElement(
+            Tags.constant, jsonEncode(constantInfo.accept(converter)));
+      }
+      features.addElement(
+          Tags.dependencies, jsonEncode(dumpInfoState.info.dependencies));
+      for (final outputUnit in dumpInfoState.info.outputUnits) {
+        var outputUnitJsonObject = outputUnit.accept(converter);
+        // Remove the size from the main output unit due to high noise ratio.
+        if (outputUnit.name == 'main') {
+          outputUnitJsonObject =
+              filteredJsonObject(outputUnitJsonObject, {'size'});
+        }
+        features.addElement(Tags.outputUnits, jsonEncode(outputUnitJsonObject));
+      }
+      features.addElement(
+          Tags.deferredFiles, jsonEncode(dumpInfoState.info.deferredFiles));
+    }
+
+    final id = LibraryId(library.canonicalUri);
+    actualMap[id] =
+        ActualData<Features>(id, features, library.canonicalUri, -1, library);
+  }
+
+  @override
+  void computeClassData(Compiler compiler, ClassEntity cls,
+      Map<Id, ActualData<Features>> actualMap,
+      {bool verbose: false}) {
+    final converter = info.AllInfoToJsonConverter(isBackwardCompatible: true);
+    DumpInfoStateData dumpInfoState = compiler.dumpInfoStateForTesting;
+
+    final features = Features();
+    final classInfo = dumpInfoState.entityToInfo[cls];
+    if (classInfo == null) return;
+
+    features.addElement(Tags.clazz, jsonEncode(classInfo.accept(converter)));
+    final classTypeInfos =
+        dumpInfoState.info.classTypes.where((i) => i.name == classInfo.name);
+    assert(
+        classTypeInfos.length < 2,
+        'Ambiguous class type info resolution. '
+        'Expected 0 or 1 elements, found: $classTypeInfos');
+    if (classTypeInfos.length == 1) {
+      features.addElement(
+          Tags.classType, jsonEncode(classTypeInfos.first.accept(converter)));
+    }
+
+    JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+    JsToElementMap elementMap = closedWorld.elementMap;
+    ir.Class node = elementMap.getClassDefinition(cls).node;
+    ClassId id = ClassId(node.name);
+    ir.TreeNode nodeWithOffset = computeTreeNodeWithOffset(node);
+    actualMap[id] = ActualData<Features>(id, features,
+        nodeWithOffset?.location?.file, nodeWithOffset?.fileOffset, cls);
+  }
+
+  @override
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<Features>> actualMap,
+      {bool verbose: false}) {
+    final converter = info.AllInfoToJsonConverter(isBackwardCompatible: true);
+    DumpInfoStateData dumpInfoState = compiler.dumpInfoStateForTesting;
+
+    final features = Features();
+    final functionInfo = dumpInfoState.entityToInfo[member];
+    if (functionInfo == null) return;
+
+    if (functionInfo is info.FunctionInfo) {
+      features.addElement(
+          Tags.function, jsonEncode(functionInfo.accept(converter)));
+      for (final use in functionInfo.uses) {
+        features.addElement(Tags.holding,
+            jsonEncode(converter.visitDependencyInfo(use), indent: false));
+      }
+      for (final closure in functionInfo.closures) {
+        features.addElement(
+            Tags.closure, jsonEncode(closure.accept(converter)));
+      }
+    }
+
+    if (functionInfo is info.FieldInfo) {
+      features.addElement(
+          Tags.function, jsonEncode(functionInfo.accept(converter)));
+      for (final use in functionInfo.uses) {
+        features.addElement(Tags.holding,
+            jsonEncode(converter.visitDependencyInfo(use), indent: false));
+      }
+      for (final closure in functionInfo.closures) {
+        features.addElement(
+            Tags.closure, jsonEncode(closure.accept(converter)));
+      }
+    }
+
+    JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+    JsToElementMap elementMap = closedWorld.elementMap;
+    ir.Member node = elementMap.getMemberDefinition(member).node;
+    Id id = computeMemberId(node);
+    ir.TreeNode nodeWithOffset = computeTreeNodeWithOffset(node);
+    actualMap[id] = ActualData<Features>(id, features,
+        nodeWithOffset?.location?.file, nodeWithOffset?.fileOffset, member);
+  }
+
+  @override
+  DataInterpreter<Features> get dataValidator =>
+      const JsonFeaturesDataInterpreter(wildcard: wildcard);
+}
+
+/// Feature interpreter for Features with Json values.
+///
+/// The data annotation reader conserves whitespace visually while ignoring
+/// them during comparison.
+class JsonFeaturesDataInterpreter implements DataInterpreter<Features> {
+  final String wildcard;
+  final JsonEncoder encoder = const JsonEncoder();
+
+  const JsonFeaturesDataInterpreter({this.wildcard});
+
+  @override
+  String isAsExpected(Features actualFeatures, String expectedData) {
+    if (wildcard != null && expectedData == wildcard) {
+      return null;
+    } else if (expectedData == '') {
+      return actualFeatures.isNotEmpty ? "Expected empty data." : null;
+    } else {
+      List<String> errorsFound = [];
+      Features expectedFeatures = Features.fromText(expectedData);
+      Set<String> validatedFeatures = Set<String>();
+      expectedFeatures.forEach((String key, Object expectedValue) {
+        validatedFeatures.add(key);
+        Object actualValue = actualFeatures[key];
+        if (!actualFeatures.containsKey(key)) {
+          errorsFound.add('No data found for $key');
+        } else if (expectedValue == '') {
+          if (actualValue != '') {
+            errorsFound.add('Non-empty data found for $key');
+          }
+        } else if (wildcard != null && expectedValue == wildcard) {
+          return;
+        } else if (expectedValue is List) {
+          if (actualValue is List) {
+            List actualList = actualValue.toList();
+            for (Object expectedObject in expectedValue) {
+              String expectedText =
+                  jsonEncode(jsonDecode(expectedObject), indent: false);
+              bool matchFound = false;
+              if (wildcard != null && expectedText.endsWith(wildcard)) {
+                // Wildcard matcher.
+                String prefix =
+                    expectedText.substring(0, expectedText.indexOf(wildcard));
+                List matches = [];
+                for (Object actualObject in actualList) {
+                  final formattedActualObject =
+                      jsonEncode(jsonDecode(actualObject), indent: false);
+                  if (formattedActualObject.startsWith(prefix)) {
+                    matches.add(actualObject);
+                    matchFound = true;
+                  }
+                }
+                for (Object match in matches) {
+                  actualList.remove(match);
+                }
+              } else {
+                for (Object actualObject in actualList) {
+                  final formattedActualObject =
+                      jsonEncode(jsonDecode(actualObject), indent: false);
+                  if (expectedText == formattedActualObject) {
+                    actualList.remove(actualObject);
+                    matchFound = true;
+                    break;
+                  }
+                }
+              }
+              if (!matchFound) {
+                errorsFound.add("No match found for $key=[$expectedText]");
+              }
+            }
+            if (actualList.isNotEmpty) {
+              errorsFound
+                  .add("Extra data found $key=[${actualList.join(',')}]");
+            }
+          } else {
+            errorsFound.add("List data expected for $key: "
+                "expected '$expectedValue', found '${actualValue}'");
+          }
+        } else if (expectedValue != actualValue) {
+          errorsFound.add("Mismatch for $key: expected '$expectedValue', "
+              "found '${actualValue}'");
+        }
+      });
+      actualFeatures.forEach((String key, Object value) {
+        if (!validatedFeatures.contains(key)) {
+          if (value == '') {
+            errorsFound.add("Extra data found '$key'");
+          } else {
+            errorsFound.add("Extra data found $key=$value");
+          }
+        }
+      });
+      return errorsFound.isNotEmpty ? errorsFound.join('\n ') : null;
+    }
+  }
+
+  @override
+  String getText(Features actualData, [String indentation]) {
+    return actualData.getText(indentation);
+  }
+
+  @override
+  bool isEmpty(Features actualData) {
+    return actualData == null || actualData.isEmpty;
+  }
+}
diff --git a/pkg/compiler/test/dump_info/dump_info_test.dart b/pkg/compiler/test/dump_info/dump_info_test.dart
index 14b711e..1b3c017 100644
--- a/pkg/compiler/test/dump_info/dump_info_test.dart
+++ b/pkg/compiler/test/dump_info/dump_info_test.dart
@@ -23,9 +23,9 @@
 final JsonEncoder indentedEncoder = const JsonEncoder.withIndent('  ');
 
 String jsonEncode(Map object, {bool indent = true}) {
-  var jsonEncoder = indent ? indentedEncoder : encoder;
+  final jsonEncoder = indent ? indentedEncoder : encoder;
   // Filter block comments since they interfere with ID test comments.
-  var json =
+  final json =
       jsonEncoder.convert(object).replaceAll('/*', '').replaceAll('*/', '');
   return json;
 }
@@ -84,7 +84,7 @@
         Tags.library, jsonEncode(libraryInfo.accept(converter)));
 
     // Store program-wide information on the main library.
-    var name = '${library.canonicalUri.pathSegments.last}';
+    final name = '${library.canonicalUri.pathSegments.last}';
     if (name.startsWith('main')) {
       for (final constantInfo in dumpInfoState.info.constants) {
         features.addElement(
@@ -160,7 +160,7 @@
         features.addElement(Tags.holding,
             jsonEncode(converter.visitDependencyInfo(use), indent: false));
       }
-      for (var closure in functionInfo.closures) {
+      for (final closure in functionInfo.closures) {
         features.addElement(
             Tags.closure, jsonEncode(closure.accept(converter)));
       }
@@ -173,7 +173,7 @@
         features.addElement(Tags.holding,
             jsonEncode(converter.visitDependencyInfo(use), indent: false));
       }
-      for (var closure in functionInfo.closures) {
+      for (final closure in functionInfo.closures) {
         features.addElement(
             Tags.closure, jsonEncode(closure.accept(converter)));
       }
diff --git a/tools/VERSION b/tools/VERSION
index 4195349..702aecd 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 238
+PRERELEASE 239
 PRERELEASE_PATCH 0
\ No newline at end of file
