Version 2.17.0-72.0.dev

Merge commit '3e6c900d4b487626fee22f8491c18d664c11eb0c' into 'dev'
diff --git a/DEPS b/DEPS
index 56ed123..1ec4625 100644
--- a/DEPS
+++ b/DEPS
@@ -110,7 +110,7 @@
   "dart_style_rev": "6f894c0ca33686122be9085f06e5b9bf6ad55262",
 
   "dartdoc_rev" : "f9cfab1b84176873c80b89e7c8b54c669344f9ed",
-  "devtools_rev" : "f265c3028d5ed9a454762532bed144fa36b2e4d5",
+  "devtools_rev" : "3b054edf3a14a4a51bc8019f456efcf0073cd626",
   "ffi_rev": "4dd32429880a57b64edaf54c9d5af8a9fa9a4ffb",
   "fixnum_rev": "848341f061359ef7ddc0cad472c2ecbb036b28ac",
   "file_rev": "0e09370f581ab6388d46fda4cdab66638c0171a1",
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart b/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart
index f10269c..d35a1b0 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart
@@ -12,7 +12,10 @@
 /// current library, and get [TypeAnnotation]s from runtime [Type] objects.
 abstract class TypeBuilder implements Builder {
   /// Adds a new type declaration to the surrounding library.
-  void declareType(DeclarationCode typeDeclaration);
+  ///
+  /// The [name] must match the name of the new [typeDeclaration] (this does
+  /// not include any type parameters, just the name).
+  void declareType(String name, DeclarationCode typeDeclaration);
 }
 
 /// The interface used to create [StaticType] instances, which are used to
@@ -117,19 +120,19 @@
 /// The apis used by [Macro]s that run on classes, to fill in the definitions
 /// of any external declarations within that class.
 abstract class ClassDefinitionBuilder implements DefinitionBuilder {
-  /// Retrieve a [VariableDefinitionBuilder] for a field by [identifier].
+  /// Retrieve a [VariableDefinitionBuilder] for a field with [identifier].
   ///
   /// Throws an [ArgumentError] if [identifier] does not refer to a field in
   /// this class.
   Future<VariableDefinitionBuilder> buildField(Identifier identifier);
 
-  /// Retrieve a [FunctionDefinitionBuilder] for a method by [identifier].
+  /// Retrieve a [FunctionDefinitionBuilder] for a method with [identifier].
   ///
   /// Throws an [ArgumentError] if [identifier] does not refer to a method in
   /// this class.
   Future<FunctionDefinitionBuilder> buildMethod(Identifier identifier);
 
-  /// Retrieve a [ConstructorDefinitionBuilder] for a constructor by
+  /// Retrieve a [ConstructorDefinitionBuilder] for a constructor with
   /// [identifier].
   ///
   /// Throws an [ArgumentError] if [identifier] does not refer to a constructor
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/api/introspection.dart b/pkg/_fe_analyzer_shared/lib/src/macros/api/introspection.dart
index 11fd6c3..d78d9e4 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/api/introspection.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/api/introspection.dart
@@ -131,6 +131,9 @@
   /// Whether this function has an `external` modifier.
   bool get isExternal;
 
+  /// Whether this function is an operator.
+  bool get isOperator;
+
   /// Whether this function is actually a getter.
   bool get isGetter;
 
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
index f01ccb8..27a7915 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
@@ -248,6 +248,9 @@
 abstract class MacroExecutionResult implements Serializable {
   /// Any augmentations that should be applied as a result of executing a macro.
   Iterable<DeclarationCode> get augmentations;
+
+  /// The names of any new types declared in [augmentations].
+  Iterable<String> get newTypeNames;
 }
 
 /// Each of the possible types of declarations a macro can be applied to
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/builder_impls.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/builder_impls.dart
index b591a3e..caba317 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/builder_impls.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/builder_impls.dart
@@ -14,18 +14,25 @@
   /// The final result, will be built up over `augment` calls.
   final List<DeclarationCode> _augmentations;
 
+  /// The names of any new types added in [_augmentations].
+  final List<String> _newTypeNames;
+
   /// Creates and returns a [MacroExecutionResult] out of the [_augmentations]
   /// created by this builder.
-  MacroExecutionResult get result =>
-      new MacroExecutionResultImpl(augmentations: _augmentations);
+  MacroExecutionResult get result => new MacroExecutionResultImpl(
+        augmentations: _augmentations,
+        newTypeNames: _newTypeNames,
+      );
 
   TypeBuilderBase({List<DeclarationCode>? parentAugmentations})
-      : _augmentations = parentAugmentations ?? [];
+      : _augmentations = parentAugmentations ?? [],
+        _newTypeNames = [];
 }
 
 class TypeBuilderImpl extends TypeBuilderBase implements TypeBuilder {
   @override
-  void declareType(DeclarationCode typeDeclaration) {
+  void declareType(String name, DeclarationCode typeDeclaration) {
+    _newTypeNames.add(name);
     _augmentations.add(typeDeclaration);
   }
 }
@@ -250,7 +257,7 @@
         Identifier clazz, List<DeclarationCode> augmentations) =>
     new DeclarationCode.fromParts([
       'augment class ',
-      clazz,
+      clazz.name,
       ' {\n',
       ...augmentations.joinAsCode('\n'),
       '\n}',
@@ -304,13 +311,14 @@
   return new DeclarationCode.fromParts([
     'augment ',
     if (declaration is ConstructorDeclaration) ...[
-      declaration.definingClass,
+      declaration.definingClass.name,
       if (declaration.identifier.name.isNotEmpty) '.',
     ] else ...[
       declaration.returnType.code,
       ' ',
+      if (declaration.isOperator) 'operator ',
     ],
-    declaration.identifier,
+    declaration.identifier.name,
     if (declaration.typeParameters.isNotEmpty) ...[
       '<',
       for (TypeParameterDeclaration typeParam
@@ -327,7 +335,7 @@
       new ParameterCode.fromParts([
         positionalRequired.type.code,
         ' ',
-        positionalRequired.identifier,
+        positionalRequired.identifier.name,
       ]),
       ', '
     ],
@@ -338,7 +346,7 @@
         new ParameterCode.fromParts([
           positionalOptional.type.code,
           ' ',
-          positionalOptional.identifier,
+          positionalOptional.identifier.name,
         ]),
         ', ',
       ],
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/introspection_impls.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/introspection_impls.dart
index 64e5e4f..9fbb7c1 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/introspection_impls.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/introspection_impls.dart
@@ -288,6 +288,9 @@
   final bool isGetter;
 
   @override
+  final bool isOperator;
+
+  @override
   final bool isSetter;
 
   @override
@@ -311,6 +314,7 @@
     required this.isAbstract,
     required this.isExternal,
     required this.isGetter,
+    required this.isOperator,
     required this.isSetter,
     required this.namedParameters,
     required this.positionalParameters,
@@ -330,6 +334,7 @@
       ..addBool(isAbstract)
       ..addBool(isExternal)
       ..addBool(isGetter)
+      ..addBool(isOperator)
       ..addBool(isSetter)
       ..startList();
     for (ParameterDeclarationImpl named in namedParameters) {
@@ -367,6 +372,7 @@
     required bool isAbstract,
     required bool isExternal,
     required bool isGetter,
+    required bool isOperator,
     required bool isSetter,
     required List<ParameterDeclarationImpl> namedParameters,
     required List<ParameterDeclarationImpl> positionalParameters,
@@ -380,6 +386,7 @@
           isAbstract: isAbstract,
           isExternal: isExternal,
           isGetter: isGetter,
+          isOperator: isOperator,
           isSetter: isSetter,
           namedParameters: namedParameters,
           positionalParameters: positionalParameters,
@@ -415,6 +422,7 @@
     required bool isAbstract,
     required bool isExternal,
     required bool isGetter,
+    required bool isOperator,
     required bool isSetter,
     required List<ParameterDeclarationImpl> namedParameters,
     required List<ParameterDeclarationImpl> positionalParameters,
@@ -430,6 +438,7 @@
           isAbstract: isAbstract,
           isExternal: isExternal,
           isGetter: isGetter,
+          isOperator: isOperator,
           isSetter: isSetter,
           namedParameters: namedParameters,
           positionalParameters: positionalParameters,
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/response_impls.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/response_impls.dart
index 39d1f61..2e1d0cc 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/response_impls.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/response_impls.dart
@@ -209,8 +209,12 @@
   @override
   final List<DeclarationCode> augmentations;
 
+  @override
+  final List<String> newTypeNames;
+
   MacroExecutionResultImpl({
     required this.augmentations,
+    required this.newTypeNames,
   });
 
   factory MacroExecutionResultImpl.deserialize(Deserializer deserializer) {
@@ -222,7 +226,19 @@
           hasNext = deserializer.moveNext())
         deserializer.expectCode()
     ];
-    return new MacroExecutionResultImpl(augmentations: augmentations);
+    deserializer.moveNext();
+    deserializer.expectList();
+    List<String> newTypeNames = [
+      for (bool hasNext = deserializer.moveNext();
+          hasNext;
+          hasNext = deserializer.moveNext())
+        deserializer.expectString()
+    ];
+
+    return new MacroExecutionResultImpl(
+      augmentations: augmentations,
+      newTypeNames: newTypeNames,
+    );
   }
 
   void serialize(Serializer serializer) {
@@ -231,5 +247,10 @@
       augmentation.serialize(serializer);
     }
     serializer.endList();
+    serializer.startList();
+    for (String name in newTypeNames) {
+      serializer.addString(name);
+    }
+    serializer.endList();
   }
 }
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/serialization_extensions.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/serialization_extensions.dart
index ff8a0b2..d11ec37 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/serialization_extensions.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/serialization_extensions.dart
@@ -117,6 +117,7 @@
         isAbstract: (this..moveNext()).expectBool(),
         isExternal: (this..moveNext()).expectBool(),
         isGetter: (this..moveNext()).expectBool(),
+        isOperator: (this..moveNext()).expectBool(),
         isSetter: (this..moveNext()).expectBool(),
         namedParameters: (this..moveNext())._expectRemoteInstanceList(),
         positionalParameters: (this..moveNext())._expectRemoteInstanceList(),
@@ -131,6 +132,7 @@
         isAbstract: (this..moveNext()).expectBool(),
         isExternal: (this..moveNext()).expectBool(),
         isGetter: (this..moveNext()).expectBool(),
+        isOperator: (this..moveNext()).expectBool(),
         isSetter: (this..moveNext()).expectBool(),
         namedParameters: (this..moveNext())._expectRemoteInstanceList(),
         positionalParameters: (this..moveNext())._expectRemoteInstanceList(),
@@ -146,6 +148,7 @@
         isAbstract: (this..moveNext()).expectBool(),
         isExternal: (this..moveNext()).expectBool(),
         isGetter: (this..moveNext()).expectBool(),
+        isOperator: (this..moveNext()).expectBool(),
         isSetter: (this..moveNext()).expectBool(),
         namedParameters: (this..moveNext())._expectRemoteInstanceList(),
         positionalParameters: (this..moveNext())._expectRemoteInstanceList(),
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 027c7bb..f8572cf 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -2770,6 +2770,23 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeEnumConstructorSuperInitializer =
+    messageEnumConstructorSuperInitializer;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageEnumConstructorSuperInitializer = const MessageCode(
+    "EnumConstructorSuperInitializer",
+    problemMessage: r"""Enum constructors can't contain super-initializers.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeEnumConstructorTearoff = messageEnumConstructorTearoff;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageEnumConstructorTearoff = const MessageCode(
+    "EnumConstructorTearoff",
+    problemMessage: r"""Enum constructors can't be torn off.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeEnumDeclarationEmpty = messageEnumDeclarationEmpty;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2799,6 +2816,16 @@
             r"""Missing arguments in enum constructor invocation.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeEnumFactoryRedirectsToConstructor =
+    messageEnumFactoryRedirectsToConstructor;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageEnumFactoryRedirectsToConstructor = const MessageCode(
+    "EnumFactoryRedirectsToConstructor",
+    problemMessage:
+        r"""Enum factory constructors can't redirect to generative constructors.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeEnumInClass = messageEnumInClass;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2817,6 +2844,15 @@
     problemMessage: r"""Enums can't be instantiated.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeEnumNonConstConstructor = messageEnumNonConstConstructor;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageEnumNonConstConstructor = const MessageCode(
+    "EnumNonConstConstructor",
+    problemMessage:
+        r"""Generative enum constructors must be marked as 'const'.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateEnumSupertypeOfNonAbstractClass =
     const Template<Message Function(String name)>(
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
index a441a40..6ebcc62 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart
@@ -7488,19 +7488,33 @@
 
     String? value = token.stringValue;
     while (identical(value, 'catch') || identical(value, 'on')) {
-      listener.beginCatchClause(token);
+      bool didBeginCatchClause = false;
       Token? onKeyword = null;
       if (identical(value, 'on')) {
         // 'on' type catchPart?
         onKeyword = token;
-        lastConsumed = computeType(token, /* required = */ true)
-            .ensureTypeNotVoid(token, this);
+        TypeInfo typeInfo = computeType(token, /* required = */ true);
+        if (catchCount > 0 && (typeInfo == noType || typeInfo.recovered)) {
+          // Not a valid on-clause and we have enough catch counts to be a valid
+          // try block already.
+          // This could for instance be code like `on([...])` or `on = 42` after
+          // some actual catch/on as that could be a valid method call, local
+          // function, assignment etc.
+          break;
+        }
+        listener.beginCatchClause(token);
+        didBeginCatchClause = true;
+        lastConsumed = typeInfo.ensureTypeNotVoid(token, this);
         token = lastConsumed.next!;
         value = token.stringValue;
       }
       Token? catchKeyword = null;
       Token? comma = null;
       if (identical(value, 'catch')) {
+        if (!didBeginCatchClause) {
+          listener.beginCatchClause(token);
+          didBeginCatchClause = true;
+        }
         catchKeyword = token;
 
         Token openParens = catchKeyword.next!;
diff --git a/pkg/_fe_analyzer_shared/test/macros/executor_shared/augmentation_library_test.dart b/pkg/_fe_analyzer_shared/test/macros/executor_shared/augmentation_library_test.dart
index 78d6908..f3a5cbd 100644
--- a/pkg/_fe_analyzer_shared/test/macros/executor_shared/augmentation_library_test.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/executor_shared/augmentation_library_test.dart
@@ -28,6 +28,10 @@
                 ]),
                 '}',
               ]),
+          ], newTypeNames: [
+            'Foo${i}0',
+            'Foo${i}1',
+            'Foo${i}2',
           ]),
       ];
       var library = _TestExecutor().buildAugmentationLibrary(
@@ -88,6 +92,8 @@
             barIdentifier,
             '();\n}',
           ]),
+        ], newTypeNames: [
+          'FooBuilder',
         ])
       ];
       var library = _TestExecutor().buildAugmentationLibrary(
diff --git a/pkg/_fe_analyzer_shared/test/macros/executor_shared/serialization_test.dart b/pkg/_fe_analyzer_shared/test/macros/executor_shared/serialization_test.dart
index 502f9f9..aabcf97 100644
--- a/pkg/_fe_analyzer_shared/test/macros/executor_shared/serialization_test.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/executor_shared/serialization_test.dart
@@ -165,6 +165,7 @@
             isAbstract: true,
             isExternal: false,
             isGetter: true,
+            isOperator: false,
             isSetter: false,
             namedParameters: [],
             positionalParameters: [],
@@ -181,6 +182,7 @@
             isAbstract: false,
             isExternal: false,
             isGetter: false,
+            isOperator: false,
             isSetter: true,
             namedParameters: [fooNamedParam],
             positionalParameters: [barPositionalParam],
@@ -197,6 +199,7 @@
           isAbstract: false,
           isExternal: false,
           isGetter: false,
+          isOperator: true,
           isSetter: false,
           namedParameters: [fooNamedParam],
           positionalParameters: [barPositionalParam],
diff --git a/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/isolate_mirror_executor_test.dart b/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/isolate_mirror_executor_test.dart
index 80136bd..30fac31 100644
--- a/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/isolate_mirror_executor_test.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/isolate_mirror_executor/isolate_mirror_executor_test.dart
@@ -68,6 +68,7 @@
           isAbstract: false,
           isExternal: false,
           isGetter: false,
+          isOperator: false,
           isSetter: false,
           identifier: IdentifierImpl(id: RemoteInstance.uniqueId, name: 'foo'),
           namedParameters: [],
diff --git a/pkg/_fe_analyzer_shared/test/macros/isolated_executor/simple_macro.dart b/pkg/_fe_analyzer_shared/test/macros/isolated_executor/simple_macro.dart
index 610c83e..79f9b2e 100644
--- a/pkg/_fe_analyzer_shared/test/macros/isolated_executor/simple_macro.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/isolated_executor/simple_macro.dart
@@ -289,40 +289,43 @@
       ];
     }
 
-    builder.declareType(DeclarationCode.fromParts([
-      'class ${clazz.identifier.name}Builder',
-      if (clazz.typeParameters.isNotEmpty) ...[
-        '<',
-        ..._buildTypeParam(clazz.typeParameters.first, true),
-        for (var typeParam in clazz.typeParameters.skip(1))
-          ..._buildTypeParam(typeParam, false),
-        '>',
-      ],
-      ' implements Builder<',
-      clazz.identifier,
-      if (clazz.typeParameters.isNotEmpty) ...[
-        '<',
-        clazz.typeParameters.first.identifier.name,
-        for (var typeParam in clazz.typeParameters)
-          ', ${typeParam.identifier.name}',
-        '>',
-      ],
-      '> {}'
-    ]));
+    var name = '${clazz.identifier.name}Builder';
+    builder.declareType(
+        name,
+        DeclarationCode.fromParts([
+          'class $name',
+          if (clazz.typeParameters.isNotEmpty) ...[
+            '<',
+            ..._buildTypeParam(clazz.typeParameters.first, true),
+            for (var typeParam in clazz.typeParameters.skip(1))
+              ..._buildTypeParam(typeParam, false),
+            '>',
+          ],
+          ' implements Builder<',
+          clazz.identifier,
+          if (clazz.typeParameters.isNotEmpty) ...[
+            '<',
+            clazz.typeParameters.first.identifier.name,
+            for (var typeParam in clazz.typeParameters)
+              ', ${typeParam.identifier.name}',
+            '>',
+          ],
+          '> {}'
+        ]));
   }
 
   @override
   FutureOr<void> buildTypesForConstructor(
       ConstructorDeclaration constructor, TypeBuilder builder) {
-    builder.declareType(DeclarationCode.fromString(
-        'class GeneratedBy${constructor.identifier.name.capitalize()} {}'));
+    var name = 'GeneratedBy${constructor.identifier.name.capitalize()}';
+    builder.declareType(name, DeclarationCode.fromString('class $name {}'));
   }
 
   @override
   FutureOr<void> buildTypesForField(
       FieldDeclaration field, TypeBuilder builder) {
-    builder.declareType(DeclarationCode.fromString(
-        'class GeneratedBy${field.identifier.name.capitalize()} {}'));
+    var name = 'GeneratedBy${field.identifier.name.capitalize()}';
+    builder.declareType(name, DeclarationCode.fromString('class $name {}'));
   }
 
   @override
@@ -333,23 +336,22 @@
         : function.isSetter
             ? 'Setter'
             : '';
-    builder.declareType(DeclarationCode.fromString(
-        'class GeneratedBy${function.identifier.name.capitalize()}'
-        '$suffix {}'));
+    var name = 'GeneratedBy${function.identifier.name.capitalize()}$suffix';
+    builder.declareType(name, DeclarationCode.fromString('class $name {}'));
   }
 
   @override
   FutureOr<void> buildTypesForMethod(
       MethodDeclaration method, TypeBuilder builder) {
-    builder.declareType(DeclarationCode.fromString(
-        'class GeneratedBy${method.identifier.name.capitalize()} {}'));
+    var name = 'GeneratedBy${method.identifier.name.capitalize()}';
+    builder.declareType(name, DeclarationCode.fromString('class $name {}'));
   }
 
   @override
   FutureOr<void> buildTypesForVariable(
       VariableDeclaration variable, TypeBuilder builder) {
-    builder.declareType(DeclarationCode.fromString(
-        'class GeneratedBy${variable.identifier.name.capitalize()} {}'));
+    var name = 'GeneratedBy${variable.identifier.name.capitalize()}';
+    builder.declareType(name, DeclarationCode.fromString('class $name {}'));
   }
 }
 
diff --git a/pkg/_fe_analyzer_shared/test/macros/util.dart b/pkg/_fe_analyzer_shared/test/macros/util.dart
index 4af5f1a..d9c1f51 100644
--- a/pkg/_fe_analyzer_shared/test/macros/util.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/util.dart
@@ -252,6 +252,7 @@
       isAbstract: false,
       isExternal: false,
       isGetter: false,
+      isOperator: false,
       isSetter: false,
       namedParameters: [],
       positionalParameters: [],
@@ -273,6 +274,7 @@
       isAbstract: false,
       isExternal: false,
       isGetter: true,
+      isOperator: false,
       isSetter: false,
       namedParameters: [],
       positionalParameters: [],
@@ -285,6 +287,7 @@
       isAbstract: false,
       isExternal: false,
       isGetter: false,
+      isOperator: false,
       isSetter: true,
       namedParameters: [],
       positionalParameters: [
@@ -339,6 +342,7 @@
       isAbstract: false,
       isExternal: false,
       isGetter: false,
+      isOperator: false,
       isSetter: false,
       namedParameters: [],
       positionalParameters: [],
@@ -370,6 +374,7 @@
       isAbstract: false,
       isExternal: false,
       isGetter: false,
+      isOperator: false,
       isSetter: false,
       namedParameters: [],
       positionalParameters: [],
diff --git a/pkg/analysis_server/lib/src/services/correction/error_fix_status.txt b/pkg/analysis_server/lib/src/services/correction/error_fix_status.txt
index badc576..d4e0bf5 100644
--- a/pkg/analysis_server/lib/src/services/correction/error_fix_status.txt
+++ b/pkg/analysis_server/lib/src/services/correction/error_fix_status.txt
@@ -4,10 +4,9 @@
 * "needs fix", if the code needs a fix, with a possible issue link
 * "fixes infeasible", if it has been deemed infeasible to write a fix for this code
 
-TODO(srawlins): Add lint names not found in LintNames?
-
 Stats:
-* 808 "needs evaluation"
+* 793 "needs evaluation"
+* 19 "needs fix"
 * 253 "has fix(es)"
 
 AnalysisOptionsErrorCode.INCLUDED_FILE_PARSE_ERROR: needs evaluation
@@ -58,14 +57,14 @@
 CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS: needs evaluation
 CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IS_NOT_SWITCH_EXPRESSION_SUBTYPE: needs evaluation
 CompileTimeErrorCode.CAST_TO_NON_TYPE: has fix(es)
-CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_INSTANCE_MEMBER: needs evaluation
-CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_STATIC_MEMBER: needs evaluation
-CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_UNKNOWN_MEMBER: needs evaluation
+CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_INSTANCE_MEMBER: needs evaluation; new in 2.15
+CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_STATIC_MEMBER: needs evaluation; new in 2.15
+CompileTimeErrorCode.CLASS_INSTANTIATION_ACCESS_TO_UNKNOWN_MEMBER: needs evaluation; new in 2.15
 CompileTimeErrorCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER: has fix(es)
 CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_FIELD: needs evaluation
-CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_GETTER: needs evaluation
+CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_GETTER: needs evaluation; new in 2.15
 CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_METHOD: needs evaluation
-CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_SETTER: needs evaluation
+CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_AND_STATIC_SETTER: needs evaluation; new in 2.15
 CompileTimeErrorCode.CONFLICTING_FIELD_AND_METHOD: needs evaluation
 CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES: needs evaluation
 CompileTimeErrorCode.CONFLICTING_METHOD_AND_FIELD: needs evaluation
@@ -106,8 +105,8 @@
 CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT: needs evaluation
 CompileTimeErrorCode.CONST_WITH_NON_TYPE: has fix(es)
 CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS: needs evaluation
-CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS_CONSTRUCTOR_TEAROFF: needs evaluation
-CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS_FUNCTION_TEAROFF: needs evaluation
+CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS_CONSTRUCTOR_TEAROFF: needs evaluation; new in 2.15
+CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS_FUNCTION_TEAROFF: needs evaluation; new in 2.15
 CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR: needs evaluation
 CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT: needs evaluation
 CompileTimeErrorCode.CONTINUE_LABEL_ON_SWITCH: needs evaluation
@@ -117,7 +116,7 @@
 CompileTimeErrorCode.DEFAULT_VALUE_ON_REQUIRED_PARAMETER: needs evaluation
 CompileTimeErrorCode.DEFERRED_IMPORT_OF_EXTENSION: needs evaluation
 CompileTimeErrorCode.DEFINITELY_UNASSIGNED_LATE_LOCAL_VARIABLE: needs evaluation
-CompileTimeErrorCode.DISALLOWED_TYPE_INSTANTIATION_EXPRESSION: needs evaluation
+CompileTimeErrorCode.DISALLOWED_TYPE_INSTANTIATION_EXPRESSION: needs fix; new in 2.15
 CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT: needs evaluation
 CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME: needs evaluation
 CompileTimeErrorCode.DUPLICATE_DEFINITION: needs evaluation
@@ -168,7 +167,7 @@
 CompileTimeErrorCode.FOR_IN_WITH_CONST_VARIABLE: needs evaluation
 CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND: needs evaluation
 CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT: needs evaluation
-CompileTimeErrorCode.GENERIC_METHOD_TYPE_INSTANTIATION_ON_DYNAMIC: needs evaluation
+CompileTimeErrorCode.GENERIC_METHOD_TYPE_INSTANTIATION_ON_DYNAMIC: needs fix; new in 2.15
 CompileTimeErrorCode.GETTER_NOT_ASSIGNABLE_SETTER_TYPES: needs evaluation
 CompileTimeErrorCode.GETTER_NOT_SUBTYPE_SETTER_TYPES: needs evaluation
 CompileTimeErrorCode.IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY: needs evaluation
@@ -223,7 +222,7 @@
 CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER: needs evaluation
 CompileTimeErrorCode.INVALID_OVERRIDE: has fix(es)
 CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS: needs evaluation
-CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION: needs evaluation
+CompileTimeErrorCode.INVALID_SUPER_FORMAL_PARAMETER_LOCATION: needs fix; new in 2.17
 CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST: needs evaluation
 CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP: needs evaluation
 CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_SET: needs evaluation
@@ -329,7 +328,7 @@
 CompileTimeErrorCode.PART_OF_DIFFERENT_LIBRARY: needs evaluation
 CompileTimeErrorCode.PART_OF_NON_PART: needs evaluation
 CompileTimeErrorCode.PART_OF_UNNAMED_LIBRARY: needs evaluation
-CompileTimeErrorCode.POSITIONAL_SUPER_FORMAL_PARAMETER_WITH_POSITIONAL_ARGUMENT: needs evaluation
+CompileTimeErrorCode.POSITIONAL_SUPER_FORMAL_PARAMETER_WITH_POSITIONAL_ARGUMENT: needs fix; new in 2.17
 CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER: needs evaluation
 CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT: needs evaluation
 CompileTimeErrorCode.PREFIX_SHADOWED_BY_LOCAL_DECLARATION: needs evaluation
@@ -368,9 +367,9 @@
 CompileTimeErrorCode.SHARED_DEFERRED_PREFIX: needs evaluation
 CompileTimeErrorCode.SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY: needs evaluation
 CompileTimeErrorCode.STATIC_ACCESS_TO_INSTANCE_MEMBER: needs evaluation
-CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_TYPE_IS_NOT_SUBTYPE_OF_ASSOCIATED: needs evaluation
-CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED: needs evaluation
-CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL: needs evaluation
+CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_TYPE_IS_NOT_SUBTYPE_OF_ASSOCIATED: needs fix; new in 2.17
+CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_NAMED: needs evaluation; new in 2.17
+CompileTimeErrorCode.SUPER_FORMAL_PARAMETER_WITHOUT_ASSOCIATED_POSITIONAL: needs fix; new in 2.17
 CompileTimeErrorCode.SUPER_IN_EXTENSION: needs evaluation
 CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT: needs evaluation
 CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR: needs evaluation
@@ -378,7 +377,7 @@
 CompileTimeErrorCode.SUPER_INVOCATION_NOT_LAST: needs evaluation
 CompileTimeErrorCode.SWITCH_CASE_COMPLETES_NORMALLY: has fix(es)
 CompileTimeErrorCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE: needs evaluation
-CompileTimeErrorCode.TEAROFF_OF_GENERATIVE_CONSTRUCTOR_OF_ABSTRACT_CLASS: needs evaluation
+CompileTimeErrorCode.TEAROFF_OF_GENERATIVE_CONSTRUCTOR_OF_ABSTRACT_CLASS: needs evaluation; new in 2.15
 CompileTimeErrorCode.THROW_OF_INVALID_TYPE: needs evaluation
 CompileTimeErrorCode.TOP_LEVEL_CYCLE: needs evaluation
 CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF: needs evaluation
@@ -408,16 +407,16 @@
 CompileTimeErrorCode.UNDEFINED_EXTENSION_SETTER: has fix(es)
 CompileTimeErrorCode.UNDEFINED_FUNCTION: has fix(es)
 CompileTimeErrorCode.UNDEFINED_GETTER: has_fix(es)
-CompileTimeErrorCode.UNDEFINED_GETTER_ON_FUNCTION_TYPE: needs evaluation
+CompileTimeErrorCode.UNDEFINED_GETTER_ON_FUNCTION_TYPE: needs fix; new in 2.15
 CompileTimeErrorCode.UNDEFINED_IDENTIFIER: has fix(es)
 CompileTimeErrorCode.UNDEFINED_IDENTIFIER_AWAIT: has fix(es)
 CompileTimeErrorCode.UNDEFINED_METHOD: has fix(es)
-CompileTimeErrorCode.UNDEFINED_METHOD_ON_FUNCTION_TYPE: needs evaluation
+CompileTimeErrorCode.UNDEFINED_METHOD_ON_FUNCTION_TYPE: needs fix; new in 2.15
 CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER: has fix(es)
 CompileTimeErrorCode.UNDEFINED_OPERATOR: has fix(es)
 CompileTimeErrorCode.UNDEFINED_PREFIXED_NAME: has fix(es)
 CompileTimeErrorCode.UNDEFINED_SETTER: has fix(es)
-CompileTimeErrorCode.UNDEFINED_SETTER_ON_FUNCTION_TYPE: needs evaluation
+CompileTimeErrorCode.UNDEFINED_SETTER_ON_FUNCTION_TYPE: needs fix; new in 2.15
 CompileTimeErrorCode.UNDEFINED_SUPER_GETTER: needs evaluation
 CompileTimeErrorCode.UNDEFINED_SUPER_METHOD: needs evaluation
 CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR: needs evaluation
@@ -427,7 +426,7 @@
 CompileTimeErrorCode.URI_DOES_NOT_EXIST: has fix(es)
 CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED: needs evaluation
 CompileTimeErrorCode.URI_WITH_INTERPOLATION: needs evaluation
-CompileTimeErrorCode.USE_OF_NATIVE_EXTENSION: needs evaluation
+CompileTimeErrorCode.USE_OF_NATIVE_EXTENSION: needs evaluation; compile-time error as of ~2.15
 CompileTimeErrorCode.USE_OF_VOID_RESULT: needs evaluation
 CompileTimeErrorCode.VARIABLE_TYPE_MISMATCH: needs evaluation
 CompileTimeErrorCode.WRONG_EXPLICIT_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE: needs evaluation
@@ -435,10 +434,10 @@
 CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS: needs evaluation
 CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER: needs evaluation
 CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS: has fix(es)
-CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_ANONYMOUS_FUNCTION: needs evaluation
+CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_ANONYMOUS_FUNCTION: needs fix; new in 2.15
 CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR: has fix(es)
 CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION: has fix(es)
-CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_FUNCTION: needs evaluation
+CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_FUNCTION: needs fix; new in ~2.15
 CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD: has fix(es)
 CompileTimeErrorCode.WRONG_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE: needs evaluation
 CompileTimeErrorCode.WRONG_TYPE_PARAMETER_VARIANCE_POSITION: needs evaluation
@@ -446,24 +445,23 @@
 CompileTimeErrorCode.YIELD_IN_NON_GENERATOR: needs evaluation
 CompileTimeErrorCode.YIELD_EACH_OF_INVALID_TYPE: needs evaluation
 CompileTimeErrorCode.YIELD_OF_INVALID_TYPE: has fix(es)
-FfiCode.ABI_SPECIFIC_INTEGER_INVALID: needs evaluation
-FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_EXTRA: needs evaluation
-FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_MISSING: needs evaluation
-FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED: needs evaluation
+FfiCode.ABI_SPECIFIC_INTEGER_INVALID: needs evaluation; new in ~2.16
+FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_EXTRA: needs evaluation; new in ~2.16
+FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_MISSING: needs evaluation; new in ~2.16
+FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED: needs evaluation; new in ~2.16
 FfiCode.ANNOTATION_ON_POINTER_FIELD: needs evaluation
 FfiCode.ARGUMENT_MUST_BE_A_CONSTANT: needs evaluation
-FfiCode.CREATION_OF_STRUCT_OR_UNION: needs evaluation
+FfiCode.CREATION_OF_STRUCT_OR_UNION: needs evaluation; new in ~2.15
 FfiCode.EMPTY_STRUCT: needs evaluation
 FfiCode.EXTRA_ANNOTATION_ON_STRUCT_FIELD: needs evaluation
 FfiCode.EXTRA_SIZE_ANNOTATION_CARRAY: needs evaluation
-FfiCode.FFI_NATIVE_MUST_BE_EXTERNAL: needs evaluation
-  FfiCode
-    .FFI_NATIVE_ONLY_CLASSES_EXTENDING_NATIVEFIELDWRAPPERCLASS1_CAN_BE_POINTER: needs evaluation
-FfiCode.FFI_NATIVE_UNEXPECTED_NUMBER_OF_PARAMETERS: needs evaluation
-FfiCode.FFI_NATIVE_UNEXPECTED_NUMBER_OF_PARAMETERS_WITH_RECEIVER: needs evaluation
+FfiCode.FFI_NATIVE_MUST_BE_EXTERNAL: needs evaluation; new in ~2.15
+FfiCode.FFI_NATIVE_ONLY_CLASSES_EXTENDING_NATIVEFIELDWRAPPERCLASS1_CAN_BE_POINTER: needs evaluation; new in ~2.15
+FfiCode.FFI_NATIVE_UNEXPECTED_NUMBER_OF_PARAMETERS: needs evaluation; new in ~2.15
+FfiCode.FFI_NATIVE_UNEXPECTED_NUMBER_OF_PARAMETERS_WITH_RECEIVER: needs evaluation; new in ~2.15
 FfiCode.FIELD_IN_STRUCT_WITH_INITIALIZER: needs evaluation
 FfiCode.FIELD_INITIALIZER_IN_STRUCT: needs evaluation
-FfiCode.FIELD_MUST_BE_EXTERNAL_IN_STRUCT: needs evaluation
+FfiCode.FIELD_MUST_BE_EXTERNAL_IN_STRUCT: needs evaluation; new in ~2.15
 FfiCode.GENERIC_STRUCT_SUBCLASS: needs evaluation
 FfiCode.INVALID_EXCEPTION_VALUE: needs evaluation
 FfiCode.INVALID_FIELD_TYPE_IN_STRUCT: needs evaluation
@@ -550,11 +548,11 @@
 HintCode.INVALID_SEALED_ANNOTATION: has fix(es)
 HintCode.INVALID_USE_OF_INTERNAL_MEMBER: needs evaluation
 HintCode.INVALID_USE_OF_PROTECTED_MEMBER: needs evaluation
-HintCode.INVALID_USE_OF_VISIBLE_FOR_OVERRIDING_MEMBER: needs evaluation
+HintCode.INVALID_USE_OF_VISIBLE_FOR_OVERRIDING_MEMBER: needs evaluation; new in ~2.15
 HintCode.INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER: needs evaluation
 HintCode.INVALID_USE_OF_VISIBLE_FOR_TESTING_MEMBER: needs evaluation
 HintCode.INVALID_VISIBILITY_ANNOTATION: needs evaluation
-HintCode.INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION: needs evaluation
+HintCode.INVALID_VISIBLE_FOR_OVERRIDING_ANNOTATION: needs fix; new in ~2.15
 HintCode.MISSING_REQUIRED_PARAM: has fix(es)
 HintCode.MISSING_REQUIRED_PARAM_WITH_DETAILS: has fix(es)
 HintCode.MISSING_RETURN: needs evaluation
@@ -563,7 +561,7 @@
 HintCode.MUST_CALL_SUPER: needs fix; https://github.com/dart-lang/sdk/issues/33985
 HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR: needs evaluation
 HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW: needs evaluation
-HintCode.NULL_ARGUMENT_TO_NON_NULL_TYPE: needs evaluation
+HintCode.NULL_ARGUMENT_TO_NON_NULL_TYPE: needs evaluation; new in ~2.15
 HintCode.NULL_AWARE_BEFORE_OPERATOR: needs evaluation
 HintCode.NULL_AWARE_IN_CONDITION: needs evaluation
 HintCode.NULL_AWARE_IN_LOGICAL_OPERATOR: needs evaluation
@@ -581,7 +579,7 @@
 HintCode.SDK_VERSION_AS_EXPRESSION_IN_CONST_CONTEXT: has fix(es)
 HintCode.SDK_VERSION_ASYNC_EXPORTED_FROM_CORE: has fix(es)
 HintCode.SDK_VERSION_BOOL_OPERATOR_IN_CONST_CONTEXT: has fix(es)
-HintCode.SDK_VERSION_CONSTRUCTOR_TEAROFFS: needs evaluation
+HintCode.SDK_VERSION_CONSTRUCTOR_TEAROFFS: needs fix; new in 2.15
 HintCode.SDK_VERSION_EQ_EQ_OPERATOR_IN_CONST_CONTEXT: has fix(es)
 HintCode.SDK_VERSION_EXTENSION_METHODS: has fix(es)
 HintCode.SDK_VERSION_GT_GT_GT_OPERATOR: has fix(es)
@@ -607,8 +605,8 @@
 HintCode.UNNECESSARY_QUESTION_MARK: needs evaluation
 HintCode.UNNECESSARY_TYPE_CHECK_FALSE: needs fix; https://github.com/dart-lang/sdk/issues/47793
 HintCode.UNNECESSARY_TYPE_CHECK_TRUE: needs fix; https://github.com/dart-lang/sdk/issues/47793
-HintCode.TEXT_DIRECTION_CODE_POINT_IN_COMMENT: needs evaluation
-HintCode.TEXT_DIRECTION_CODE_POINT_IN_LITERAL: needs evaluation
+HintCode.TEXT_DIRECTION_CODE_POINT_IN_COMMENT: needs fix; new in ~2.16
+HintCode.TEXT_DIRECTION_CODE_POINT_IN_LITERAL: needs fix; new in ~2.16
 HintCode.UNUSED_CATCH_CLAUSE: has fix(es)
 HintCode.UNUSED_CATCH_STACK: has fix(es)
 HintCode.UNUSED_ELEMENT: has fix(es)
@@ -868,7 +866,7 @@
 ParserErrorCode.CONST_METHOD: needs evaluation
 ParserErrorCode.CONST_TYPEDEF: needs evaluation
 ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE: needs evaluation
-ParserErrorCode.CONSTRUCTOR_WITH_TYPE_ARGUMENTS: needs evaluation
+ParserErrorCode.CONSTRUCTOR_WITH_TYPE_ARGUMENTS: needs evaluation; new in ~2.15
 ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP: needs evaluation
 ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE: needs evaluation
 ParserErrorCode.COVARIANT_AND_STATIC: needs evaluation
@@ -1045,20 +1043,20 @@
 ParserErrorCode.WITH_BEFORE_EXTENDS: needs evaluation
 ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER: needs evaluation
 ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP: needs evaluation
-PubspecWarningCode.ASSET_DOES_NOT_EXIST: needs evaluation
-PubspecWarningCode.ASSET_DIRECTORY_DOES_NOT_EXIST: needs evaluation
-PubspecWarningCode.ASSET_FIELD_NOT_LIST: needs evaluation
-PubspecWarningCode.ASSET_NOT_STRING: needs evaluation
-PubspecWarningCode.DEPENDENCIES_FIELD_NOT_MAP: needs evaluation
-PubspecWarningCode.DEPRECATED_FIELD: needs evaluation
-PubspecWarningCode.FLUTTER_FIELD_NOT_MAP: needs evaluation
+PubspecWarningCode.ASSET_DOES_NOT_EXIST: needs evaluation; new in ~2.15
+PubspecWarningCode.ASSET_DIRECTORY_DOES_NOT_EXIST: needs evaluation; new in ~2.15
+PubspecWarningCode.ASSET_FIELD_NOT_LIST: needs evaluation; new in ~2.15
+PubspecWarningCode.ASSET_NOT_STRING: needs evaluation; new in ~2.15
+PubspecWarningCode.DEPENDENCIES_FIELD_NOT_MAP: needs evaluation; new in ~2.15
+PubspecWarningCode.DEPRECATED_FIELD: needs evaluation; new in ~2.15
+PubspecWarningCode.FLUTTER_FIELD_NOT_MAP: needs evaluation; new in ~2.15
 PubspecWarningCode.INVALID_DEPENDENCY: needs evaluation
-PubspecWarningCode.MISSING_NAME: needs evaluation
-PubspecWarningCode.NAME_NOT_STRING: needs evaluation
+PubspecWarningCode.MISSING_NAME: needs evaluation; new in ~2.15
+PubspecWarningCode.NAME_NOT_STRING: needs evaluation; new in ~2.15
 PubspecWarningCode.PATH_DOES_NOT_EXIST: needs evaluation
-PubspecWarningCode.PATH_NOT_POSIX: needs evaluation
+PubspecWarningCode.PATH_NOT_POSIX: needs evaluation; new in ~2.15
 PubspecWarningCode.PATH_PUBSPEC_DOES_NOT_EXIST: needs evaluation
-PubspecWarningCode.UNNECESSARY_DEV_DEPENDENCY: needs evaluation
+PubspecWarningCode.UNNECESSARY_DEV_DEPENDENCY: needs evaluation; new in ~2.15
 ScannerErrorCode.EXPECTED_TOKEN: needs evaluation
 ScannerErrorCode.ILLEGAL_CHARACTER: needs evaluation
 ScannerErrorCode.MISSING_DIGIT: needs evaluation
diff --git a/pkg/analysis_server/test/client/completion_driver_test.dart b/pkg/analysis_server/test/client/completion_driver_test.dart
index 52c2abf..848a1e8 100644
--- a/pkg/analysis_server/test/client/completion_driver_test.dart
+++ b/pkg/analysis_server/test/client/completion_driver_test.dart
@@ -4,12 +4,11 @@
 
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/services/completion/dart/utilities.dart';
-import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
-import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../domain_completion_test.dart';
 import '../services/completion/dart/completion_check.dart';
 import '../services/completion/dart/completion_contributor_util.dart';
 import 'impl/completion_driver.dart';
@@ -23,14 +22,14 @@
   });
 }
 
-abstract class AbstractCompletionDriverTest with ResourceProviderMixin {
+abstract class AbstractCompletionDriverTest
+    extends PubPackageAnalysisServerTest {
   late CompletionDriver driver;
-  Map<String, String> packageRoots = {};
   late List<CompletionSuggestion> suggestions;
 
-  String get projectName => 'project';
-
-  String get projectPath => '/$projectName';
+  bool get isProtocolVersion2 {
+    return protocol == TestingCompletionProtocol.version2;
+  }
 
   TestingCompletionProtocol get protocol;
 
@@ -38,14 +37,12 @@
 
   bool get supportsAvailableSuggestions;
 
-  String get testFilePath => '$projectPath/bin/test.dart';
-
   Future<void> addProjectFile(String relativePath, String content) async {
-    newFile('$projectPath/$relativePath', content: content);
+    newFile('$testPackageRootPath/$relativePath', content: content);
     // todo (pq): handle more than lib
     expect(relativePath, startsWith('lib/'));
     var packageRelativePath = relativePath.substring(4);
-    var uriStr = 'package:$projectName/$packageRelativePath';
+    var uriStr = 'package:test/$packageRelativePath';
     await driver.waitForSetWithUri(uriStr);
   }
 
@@ -148,23 +145,20 @@
     }
   }
 
-  @mustCallSuper
+  @override
   Future<void> setUp() async {
+    super.setUp();
+
+    writeTestPackagePubspecYamlFile(r'''
+name: test
+''');
+
     driver = CompletionDriver(
       supportsAvailableSuggestions: supportsAvailableSuggestions,
-      projectPath: projectPath,
-      testFilePath: testFilePath,
-      resourceProvider: resourceProvider,
-      serverOptions: serverOptions,
+      server: this,
     );
-    await driver.createProject(packageRoots: packageRoots);
+    await driver.createProject();
 
-    newPubspecYamlFile(projectPath, '''
-name: project
-''');
-    newDotPackagesFile(projectPath, content: '''
-project:${toUri('$projectPath/lib')}
-''');
     // todo (pq): add logic (possibly to driver) that waits for SDK suggestions
   }
 
@@ -310,9 +304,6 @@
   @override
   bool get supportsAvailableSuggestions => true;
 
-  @override
-  String get testFilePath => '$projectPath/lib/test.dart';
-
   Future<void> test_project_filterImports_defaultConstructor() async {
     await addProjectFile('lib/a.dart', r'''
 class A {}
diff --git a/pkg/analysis_server/test/client/impl/abstract_client.dart b/pkg/analysis_server/test/client/impl/abstract_client.dart
deleted file mode 100644
index d1ad27f..0000000
--- a/pkg/analysis_server/test/client/impl/abstract_client.dart
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright (c) 2020, 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.
-
-import 'package:analysis_server/protocol/protocol.dart';
-import 'package:analysis_server/protocol/protocol_generated.dart'
-    hide AnalysisOptions;
-import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/domain_analysis.dart';
-import 'package:analysis_server/src/domain_completion.dart';
-import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
-import 'package:analysis_server/src/utilities/mocks.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/test_utilities/mock_sdk.dart';
-import 'package:matcher/matcher.dart';
-import 'package:meta/meta.dart';
-
-import '../../mocks.dart';
-
-abstract class AbstractClient {
-  final MockServerChannel serverChannel;
-  final TestPluginManager pluginManager;
-  late AnalysisServer server;
-
-  final List<GeneralAnalysisService> generalServices =
-      <GeneralAnalysisService>[];
-  final Map<AnalysisService, List<String>> analysisSubscriptions = {};
-
-  final String projectPath;
-  final String testFilePath;
-  late String testCode;
-
-  final AnalysisServerOptions serverOptions;
-
-  AbstractClient({
-    required this.projectPath,
-    required this.testFilePath,
-    required String sdkPath,
-    required this.serverOptions,
-  })  : serverChannel = MockServerChannel(),
-        pluginManager = TestPluginManager() {
-    server = createAnalysisServer(sdkPath);
-    var notificationStream = serverChannel.notificationController.stream;
-    notificationStream.listen((Notification notification) {
-      processNotification(notification);
-    });
-  }
-
-  AnalysisDomainHandler get analysisHandler =>
-      server.handlers.singleWhere((handler) => handler is AnalysisDomainHandler)
-          as AnalysisDomainHandler;
-
-  AnalysisOptions get analysisOptions => testDriver.analysisOptions;
-
-  CompletionDomainHandler get completionHandler =>
-      server.handlers.whereType<CompletionDomainHandler>().single;
-
-  MemoryResourceProvider get resourceProvider;
-
-  AnalysisDriver get testDriver => server.getAnalysisDriver(testFilePath)!;
-
-  void addAnalysisOptionsFile(String content) {
-    newFile(
-        resourceProvider.pathContext.join(projectPath, 'analysis_options.yaml'),
-        content);
-  }
-
-  void addAnalysisSubscription(AnalysisService service, String file) {
-    // add file to subscription
-    var files = analysisSubscriptions[service];
-    if (files == null) {
-      files = <String>[];
-      analysisSubscriptions[service] = files;
-    }
-    files.add(file);
-    // set subscriptions
-    var request =
-        AnalysisSetSubscriptionsParams(analysisSubscriptions).toRequest('0');
-    handleSuccessfulRequest(request);
-  }
-
-  void addGeneralAnalysisSubscription(GeneralAnalysisService service) {
-    generalServices.add(service);
-    var request =
-        AnalysisSetGeneralSubscriptionsParams(generalServices).toRequest('0');
-    handleSuccessfulRequest(request);
-  }
-
-  String addTestFile(String content) {
-    newFile(testFilePath, content);
-    testCode = content;
-    return testFilePath;
-  }
-
-  void assertValidId(String id) {
-    expect(id, isNotNull);
-    expect(id.isNotEmpty, isTrue);
-  }
-
-  /// Create an analysis server with the given [sdkPath].
-  AnalysisServer createAnalysisServer(String sdkPath) {
-    createMockSdk(
-      resourceProvider: resourceProvider,
-      root: newFolder(sdkPath),
-    );
-    return AnalysisServer(
-        serverChannel,
-        resourceProvider,
-        serverOptions,
-        DartSdkManager(sdkPath),
-        CrashReportingAttachmentsBuilder.empty,
-        InstrumentationService.NULL_SERVICE);
-  }
-
-  /// Create a project at [projectPath].
-  @mustCallSuper
-  Future<void> createProject({Map<String, String>? packageRoots}) async {
-    newFolder(projectPath);
-
-    await setRoots(
-        included: [projectPath], excluded: [], packageRoots: packageRoots);
-  }
-
-  void expect(actual, matcher, {String reason});
-
-  /// Validate that the given [request] is handled successfully.
-  Response handleSuccessfulRequest(Request request, {RequestHandler? handler}) {
-    handler ??= analysisHandler;
-    var response = handler.handleRequest(request, NotCancelableToken())!;
-    expect(response, isResponseSuccess(request.id));
-    return response;
-  }
-
-  File newFile(String path, String content);
-
-  Folder newFolder(String path);
-
-  void processNotification(Notification notification);
-
-  Future<Response> setRoots({
-    required List<String> included,
-    required List<String> excluded,
-    Map<String, String>? packageRoots,
-  }) async {
-    var request = AnalysisSetAnalysisRootsParams(included, excluded,
-            packageRoots: packageRoots)
-        .toRequest('0');
-    var response = await waitResponse(request);
-    expect(response, isResponseSuccess(request.id));
-    return response;
-  }
-
-  /// Returns a [Future] that completes when the server's analysis is complete.
-  Future waitForTasksFinished() => server.onAnalysisComplete;
-
-  /// Completes with a successful [Response] for the given [request].
-  /// Otherwise fails.
-  Future<Response> waitResponse(Request request,
-      {bool throwOnError = true}) async {
-    return serverChannel.sendRequest(request, throwOnError: throwOnError);
-  }
-}
diff --git a/pkg/analysis_server/test/client/impl/completion_driver.dart b/pkg/analysis_server/test/client/impl/completion_driver.dart
index 4907915..4c4cafb 100644
--- a/pkg/analysis_server/test/client/impl/completion_driver.dart
+++ b/pkg/analysis_server/test/client/impl/completion_driver.dart
@@ -9,15 +9,12 @@
 import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart'
     hide AnalysisOptions;
-import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:matcher/matcher.dart';
 import 'package:meta/meta.dart';
 
 import '../../constants.dart';
-import 'abstract_client.dart';
+import '../../domain_completion_test.dart';
 import 'expect_mixin.dart';
 
 CompletionSuggestion _createCompletionSuggestionFromAvailableSuggestion(
@@ -39,9 +36,16 @@
     }
   }
 
+  // todo (pq): in IDEA, this is "UNKNOWN" but here we need a value; figure out what's up.
+  var suggestionKind = CompletionSuggestionKind.IDENTIFIER;
+  if (suggestion.element.kind == ElementKind.CONSTRUCTOR ||
+      suggestion.element.kind == ElementKind.FUNCTION ||
+      suggestion.element.kind == ElementKind.METHOD) {
+    suggestionKind = CompletionSuggestionKind.INVOCATION;
+  }
+
   return CompletionSuggestion(
-    // todo (pq): in IDEA, this is "UNKNOWN" but here we need a value; figure out what's up.
-    CompletionSuggestionKind.INVOCATION,
+    suggestionKind,
     suggestionSetRelevance + relevanceBoost,
     suggestion.label,
     0,
@@ -56,9 +60,9 @@
   );
 }
 
-class CompletionDriver extends AbstractClient with ExpectMixin {
+class CompletionDriver with ExpectMixin {
+  final PubPackageAnalysisServerTest server;
   final bool supportsAvailableSuggestions;
-  final MemoryResourceProvider _resourceProvider;
 
   Map<String, Completer<void>> receivedSuggestionsCompleters = {};
   List<CompletionSuggestion> suggestions = [];
@@ -78,51 +82,53 @@
 
   CompletionDriver({
     required this.supportsAvailableSuggestions,
-    AnalysisServerOptions? serverOptions,
-    required MemoryResourceProvider resourceProvider,
-    required String projectPath,
-    required String testFilePath,
-  })  : _resourceProvider = resourceProvider,
-        super(
-            serverOptions: serverOptions ?? AnalysisServerOptions(),
-            projectPath: resourceProvider.convertPath(projectPath),
-            testFilePath: resourceProvider.convertPath(testFilePath),
-            sdkPath: resourceProvider.convertPath('/sdk'));
+    required this.server,
+  }) {
+    server.serverChannel.notificationController.stream
+        .listen((Notification notification) {
+      processNotification(notification);
+    });
+  }
 
-  @override
-  MemoryResourceProvider get resourceProvider => _resourceProvider;
-
-  @override
-  String addTestFile(String content, {int? offset}) {
+  void addTestFile(String content, {int? offset}) {
     completionOffset = content.indexOf('^');
     if (offset != null) {
       expect(completionOffset, -1, reason: 'cannot supply offset and ^');
       completionOffset = offset;
-      return super.addTestFile(content);
+      server.newFile(server.testFilePath, content: content);
+    } else {
+      expect(completionOffset, isNot(equals(-1)), reason: 'missing ^');
+      var nextOffset = content.indexOf('^', completionOffset + 1);
+      expect(nextOffset, equals(-1), reason: 'too many ^');
+      server.newFile(server.testFilePath,
+          content: content.substring(0, completionOffset) +
+              content.substring(completionOffset + 1));
     }
-    expect(completionOffset, isNot(equals(-1)), reason: 'missing ^');
-    var nextOffset = content.indexOf('^', completionOffset + 1);
-    expect(nextOffset, equals(-1), reason: 'too many ^');
-    return super.addTestFile(content.substring(0, completionOffset) +
-        content.substring(completionOffset + 1));
   }
 
-  @override
-  Future<void> createProject({Map<String, String>? packageRoots}) async {
-    await super.createProject(packageRoots: packageRoots);
+  void assertValidId(String id) {
+    expect(id, isNotNull);
+    expect(id.isNotEmpty, isTrue);
+  }
+
+  Future<void> createProject() async {
+    await server.setRoots(included: [server.workspaceRootPath], excluded: []);
+
     if (supportsAvailableSuggestions) {
-      var request = CompletionSetSubscriptionsParams(
-          [CompletionService.AVAILABLE_SUGGESTION_SETS]).toRequest('0');
-      handleSuccessfulRequest(request, handler: completionHandler);
+      await server.handleRequest(
+        CompletionSetSubscriptionsParams([
+          CompletionService.AVAILABLE_SUGGESTION_SETS,
+        ]).toRequest('0'),
+      );
     }
   }
 
   Future<List<CompletionSuggestion>> getSuggestions() async {
-    await waitForTasksFinished();
-
-    var request = CompletionGetSuggestionsParams(testFilePath, completionOffset)
-        .toRequest('0');
-    var response = await waitResponse(request);
+    var request = CompletionGetSuggestionsParams(
+      server.testFilePath,
+      completionOffset,
+    ).toRequest('0');
+    var response = await server.handleRequest(request);
     var result = CompletionGetSuggestionsResult.fromResponse(response);
     completionId = result.id;
     assertValidId(completionId);
@@ -131,30 +137,19 @@
   }
 
   Future<List<CompletionSuggestion>> getSuggestions2() async {
-    await waitForTasksFinished();
-
     var request = CompletionGetSuggestions2Params(
-      testFilePath,
+      server.testFilePath,
       completionOffset,
       1 << 16,
       timeout: 60 * 1000,
     ).toRequest('0');
-    var response = await waitResponse(request);
+    var response = await server.handleRequest(request);
     var result = CompletionGetSuggestions2Result.fromResponse(response);
     replacementOffset = result.replacementOffset;
     replacementLength = result.replacementLength;
     return result.suggestions;
   }
 
-  @override
-  File newFile(String path, String content) =>
-      resourceProvider.newFile(resourceProvider.convertPath(path), content);
-
-  @override
-  Folder newFolder(String path) =>
-      resourceProvider.newFolder(resourceProvider.convertPath(path));
-
-  @override
   @mustCallSuper
   Future<void> processNotification(Notification notification) async {
     if (notification.event == COMPLETION_RESULTS) {
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 82c6e44..608f706 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -149,7 +149,7 @@
             testFilePathPlatform, 0, 'Random', '[foo]:bar')
         .toRequest('0');
 
-    var response = await _handleRequest(request);
+    var response = await handleRequest(request);
     expect(response.error?.code, RequestErrorCode.INVALID_PARAMETER);
     // TODO(scheglov) Check that says "libraryUri".
   }
@@ -161,7 +161,7 @@
         CompletionGetSuggestionDetails2Params('foo', 0, 'Random', 'dart:math')
             .toRequest('0');
 
-    var response = await _handleRequest(request);
+    var response = await handleRequest(request);
     expect(response.error?.code, RequestErrorCode.INVALID_FILE_PATH_FORMAT);
   }
 
@@ -1918,7 +1918,7 @@
       0,
       1 << 10,
     ).toRequest(id);
-    var futureResponse = _handleRequest(request);
+    var futureResponse = handleRequest(request);
     return RequestWithFutureResponse(offset, request, futureResponse);
   }
 }
@@ -2862,6 +2862,10 @@
 
   String get workspaceRootPath => '/home';
 
+  Future<Response> handleRequest(Request request) async {
+    return await serverChannel.sendRequest(request);
+  }
+
   Future<void> setRoots({
     required List<String> included,
     required List<String> excluded,
@@ -2877,6 +2881,7 @@
     );
   }
 
+  @mustCallSuper
   void setUp() {
     serverChannel = MockServerChannel();
 
@@ -2935,13 +2940,9 @@
     await server.onAnalysisComplete;
   }
 
-  Future<Response> _handleRequest(Request request) async {
-    return await serverChannel.sendRequest(request);
-  }
-
   /// Validates that the given [request] is handled successfully.
   Future<Response> _handleSuccessfulRequest(Request request) async {
-    var response = await _handleRequest(request);
+    var response = await handleRequest(request);
     expect(response, isResponseSuccess(request.id));
     return response;
   }
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_check.dart b/pkg/analysis_server/test/services/completion/dart/completion_check.dart
index 57a911e..de00669 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_check.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_check.dart
@@ -179,6 +179,16 @@
     element.isNotNull.kind.isConstructor;
   }
 
+  void get isEnum {
+    kind.isIdentifier;
+    element.isNotNull.kind.isEnum;
+  }
+
+  void get isEnumConstant {
+    kind.isIdentifier;
+    element.isNotNull.kind.isEnumConstant;
+  }
+
   void get isField {
     kind.isIdentifier;
     element.isNotNull.kind.isField;
@@ -194,6 +204,11 @@
     element.isNotNull.kind.isGetter;
   }
 
+  void get isImportPrefix {
+    kind.isIdentifier;
+    element.isNotNull.kind.isPrefix;
+  }
+
   void get isMethodInvocation {
     kind.isInvocation;
     element.isNotNull.kind.isMethod;
@@ -381,6 +396,14 @@
     isEqualTo(ElementKind.CONSTRUCTOR);
   }
 
+  void get isEnum {
+    isEqualTo(ElementKind.ENUM);
+  }
+
+  void get isEnumConstant {
+    isEqualTo(ElementKind.ENUM_CONSTANT);
+  }
+
   void get isField {
     isEqualTo(ElementKind.FIELD);
   }
@@ -401,6 +424,10 @@
     isEqualTo(ElementKind.PARAMETER);
   }
 
+  void get isPrefix {
+    isEqualTo(ElementKind.PREFIX);
+  }
+
   void get isSetter {
     isEqualTo(ElementKind.SETTER);
   }
diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/enum_test.dart b/pkg/analysis_server/test/services/completion/dart/declaration/enum_test.dart
index 842ac90..1cbdf28 100644
--- a/pkg/analysis_server/test/services/completion/dart/declaration/enum_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/declaration/enum_test.dart
@@ -31,57 +31,285 @@
   @override
   bool get supportsAvailableSuggestions => true;
 
-  Future<void> test_unprefixed_imported() async {
+  Future<void> test_enumConstantName() async {
+    await _check_locations(
+      declaration: 'enum MyEnum { foo01 }',
+      codeAtCompletion: 'foo0^',
+      validator: (response) {
+        check(response).hasReplacement(left: 4);
+
+        if (isProtocolVersion2) {
+          check(response).suggestions.matches([
+            (suggestion) => suggestion
+              ..completion.isEqualTo('MyEnum.foo01')
+              ..isEnumConstant,
+          ]);
+          // No other suggestions.
+        } else {
+          check(response).suggestions.includesAll([
+            (suggestion) => suggestion
+              ..completion.isEqualTo('MyEnum.foo01')
+              ..isEnumConstant,
+            // The response includes much more, such as `MyEnum` itself.
+            // We don't expect though that the client will show it.
+            (suggestion) => suggestion
+              ..completion.isEqualTo('MyEnum')
+              ..isEnum,
+          ]);
+        }
+      },
+    );
+  }
+
+  Future<void> test_enumConstantName_imported_withPrefix() async {
+    await addProjectFile('lib/a.dart', r'''
+enum MyEnum { foo01 }
+''');
+
+    var response = await getTestCodeSuggestions('''
+import 'a.dart' as prefix;
+
+void f() {
+  foo0^
+}
+''');
+
+    check(response).hasReplacement(left: 4);
+
+    if (isProtocolVersion2) {
+      check(response).suggestions.matches([
+        (suggestion) => suggestion
+          ..completion.isEqualTo('prefix.MyEnum.foo01')
+          ..isEnumConstant,
+      ]);
+    } else {
+      // TODO(scheglov) This is wrong.
+      check(response).suggestions.includesAll([
+        (suggestion) => suggestion
+          ..completion.isEqualTo('MyEnum.foo01')
+          ..isEnumConstant,
+      ]);
+    }
+  }
+
+  Future<void> test_enumName() async {
+    await _check_locations(
+      declaration: 'enum MyEnum { foo01 }',
+      codeAtCompletion: 'MyEnu^',
+      validator: (response) {
+        check(response).hasReplacement(left: 5);
+
+        if (isProtocolVersion2) {
+          check(response).suggestions.matches([
+            (suggestion) => suggestion
+              ..completion.isEqualTo('MyEnum')
+              ..isEnum,
+          ]);
+          // No enum constants.
+        } else {
+          check(response).suggestions.includesAll([
+            (suggestion) => suggestion
+              ..completion.isEqualTo('MyEnum')
+              ..isEnum,
+          ]);
+        }
+      },
+    );
+  }
+
+  Future<void> test_enumName_imported_withPrefix() async {
+    await addProjectFile('lib/a.dart', r'''
+enum MyEnum { foo01 }
+''');
+
+    var response = await getTestCodeSuggestions('''
+import 'a.dart' as prefix;
+
+void f() {
+  MyEnu^
+}
+''');
+
+    check(response).hasReplacement(left: 5);
+
+    if (isProtocolVersion2) {
+      check(response).suggestions.matches([
+        (suggestion) => suggestion
+          ..completion.isEqualTo('prefix.MyEnum')
+          ..isEnum,
+      ]);
+    } else {
+      // TODO(scheglov) This is wrong.
+      check(response).suggestions.includesAll([
+        (suggestion) => suggestion
+          ..completion.isEqualTo('MyEnum')
+          ..isEnum,
+      ]);
+    }
+  }
+
+  @FailingTest(reason: 'element.kind is LIBRARY')
+  Future<void> test_importPrefix() async {
     await addProjectFile('lib/a.dart', r'''
 enum MyEnum { v }
 ''');
 
     var response = await getTestCodeSuggestions('''
-import 'a.dart';
+import 'a.dart' as prefix01;
 
 void f() {
-  ^
+  prefix0^
 }
 ''');
 
-    _checkUnprefixed(response);
+    check(response).hasReplacement(left: 7);
+
+    if (isProtocolVersion2) {
+      check(response).suggestions.matches([
+        (suggestion) => suggestion
+          ..completion.isEqualTo('prefix01')
+          ..isImportPrefix,
+      ]);
+    } else {
+      check(response).suggestions.includesAll([
+        (suggestion) => suggestion
+          ..completion.isEqualTo('prefix01')
+          ..isImportPrefix,
+      ]);
+    }
   }
 
-  Future<void> test_unprefixed_local() async {
-    var response = await getTestCodeSuggestions('''
-enum MyEnum { v }
-
-void f() {
-  ^
-}
-''');
-
-    _checkUnprefixed(response);
-  }
-
-  Future<void> test_unprefixed_notImported() async {
+  Future<void> test_importPrefix_dot() async {
     await addProjectFile('lib/a.dart', r'''
 enum MyEnum { v }
 ''');
 
     var response = await getTestCodeSuggestions('''
+import 'a.dart' as prefix;
+
 void f() {
-  ^
+  prefix.^
 }
 ''');
 
-    _checkUnprefixed(response);
-  }
+    check(response).hasEmptyReplacement();
 
-  void _checkUnprefixed(CompletionResponseForTesting response) {
     check(response).suggestions
       ..includesAll([
-        (suggestion) => suggestion.completion.isEqualTo('MyEnum.v'),
-      ])
-      ..excludesAll([
         (suggestion) => suggestion
-          ..completion.startsWith('MyEnum')
-          ..isConstructorInvocation,
+          ..completion.isEqualTo('MyEnum')
+          ..isEnum,
+      ])
+      // TODO(scheglov) This is wrong.
+      // Should include constants, as [test_nothing_imported_withPrefix] does.
+      ..excludesAll([
+        (suggestion) => suggestion.isEnumConstant,
       ]);
   }
+
+  Future<void> test_nothing() async {
+    await _check_locations(
+      declaration: 'enum MyEnum { v }',
+      codeAtCompletion: '^',
+      validator: (response) {
+        check(response).hasEmptyReplacement();
+
+        check(response).suggestions
+          ..includesAll([
+            (suggestion) => suggestion
+              ..completion.isEqualTo('MyEnum')
+              ..isEnum,
+            (suggestion) => suggestion
+              ..completion.isEqualTo('MyEnum.v')
+              ..isEnumConstant,
+          ])
+          ..excludesAll([
+            (suggestion) => suggestion
+              ..completion.startsWith('MyEnum')
+              ..isConstructorInvocation,
+          ]);
+      },
+    );
+  }
+
+  Future<void> test_nothing_imported_withPrefix() async {
+    await addProjectFile('lib/a.dart', r'''
+enum MyEnum { v }
+''');
+
+    var response = await getTestCodeSuggestions('''
+import 'a.dart' as prefix;
+
+void f() {
+  ^
+}
+''');
+
+    check(response).hasEmptyReplacement();
+
+    if (isProtocolVersion2) {
+      check(response).suggestions.includesAll([
+        (suggestion) => suggestion
+          ..completion.isEqualTo('prefix.MyEnum')
+          ..isEnum,
+        (suggestion) => suggestion
+          ..completion.isEqualTo('prefix.MyEnum.v')
+          ..isEnumConstant,
+      ]);
+    } else {
+      // TODO(scheglov) This is wrong.
+      check(response).suggestions.includesAll([
+        (suggestion) => suggestion
+          ..completion.isEqualTo('MyEnum')
+          ..isEnum,
+        (suggestion) => suggestion
+          ..completion.isEqualTo('MyEnum.v')
+          ..isEnumConstant,
+      ]);
+    }
+  }
+
+  Future<void> _check_locations({
+    required String declaration,
+    required String codeAtCompletion,
+    required void Function(CompletionResponseForTesting response) validator,
+  }) async {
+    // local
+    {
+      var response = await getTestCodeSuggestions('''
+$declaration
+void f() {
+  $codeAtCompletion
+}
+''');
+      validator(response);
+    }
+
+    // imported
+    {
+      await addProjectFile('lib/a.dart', '''
+$declaration
+''');
+      var response = await getTestCodeSuggestions('''
+import 'a.dart';
+void f() {
+  $codeAtCompletion
+}
+''');
+      validator(response);
+    }
+
+    // not imported
+    {
+      await addProjectFile('lib/a.dart', '''
+$declaration
+''');
+      var response = await getTestCodeSuggestions('''
+void f() {
+  $codeAtCompletion
+}
+''');
+      validator(response);
+    }
+  }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/location/field_formal_parameter_test.dart
similarity index 67%
rename from pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
rename to pkg/analysis_server/test/services/completion/dart/location/field_formal_parameter_test.dart
index d63a695..b34836b 100644
--- a/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/field_formal_parameter_test.dart
@@ -1,55 +1,58 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// 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.
 
-import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
-import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
-import 'package:analysis_server/src/services/completion/dart/field_formal_contributor.dart';
-import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer_utilities/check/check.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'completion_check.dart';
-import 'completion_contributor_util.dart';
+import '../../../../client/completion_driver_test.dart';
+import '../completion_check.dart';
 
 void main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(FieldFormalContributorTest);
+    defineReflectiveTests(FieldFormalParameterTest1);
+    defineReflectiveTests(FieldFormalParameterTest2);
   });
 }
 
 @reflectiveTest
-class FieldFormalContributorTest extends DartCompletionContributorTest {
+class FieldFormalParameterTest1 extends AbstractCompletionDriverTest
+    with SuperFormalParameterTestCases {
   @override
-  DartCompletionContributor createContributor(
-    DartCompletionRequest request,
-    SuggestionBuilder builder,
-  ) {
-    return FieldFormalContributor(request, builder);
-  }
+  TestingCompletionProtocol get protocol => TestingCompletionProtocol.version1;
+}
+
+@reflectiveTest
+class FieldFormalParameterTest2 extends AbstractCompletionDriverTest
+    with SuperFormalParameterTestCases {
+  @override
+  TestingCompletionProtocol get protocol => TestingCompletionProtocol.version2;
+}
+
+mixin SuperFormalParameterTestCases on AbstractCompletionDriverTest {
+  @override
+  bool get supportsAvailableSuggestions => true;
 
   /// https://github.com/dart-lang/sdk/issues/39028
   Future<void> test_mixin_constructor() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 mixin M {
   var field = 0;
   M(this.^);
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response).suggestions.isEmpty;
   }
 
   Future<void> test_replacement_left() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   var field = 0;
   A(this.f^);
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasReplacement(left: 1)
       ..suggestions.matchesInAnyOrder([
@@ -61,14 +64,13 @@
   }
 
   Future<void> test_replacement_right() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   var field = 0;
   A(this.^f);
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasReplacement(right: 1)
       ..suggestions.matchesInAnyOrder([
@@ -80,7 +82,7 @@
   }
 
   Future<void> test_suggestions_onlyLocal() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   var inherited = 0;
 }
@@ -94,7 +96,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -110,7 +111,7 @@
   }
 
   Future<void> test_suggestions_onlyNotSpecified_optionalNamed() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class Point {
   final int x;
   final int y;
@@ -118,7 +119,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -130,7 +130,7 @@
   }
 
   Future<void> test_suggestions_onlyNotSpecified_requiredPositional() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class Point {
   final int x;
   final int y;
@@ -138,7 +138,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
diff --git a/pkg/analysis_server/test/services/completion/dart/super_formal_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/location/super_formal_parameter_test.dart
similarity index 81%
rename from pkg/analysis_server/test/services/completion/dart/super_formal_contributor_test.dart
rename to pkg/analysis_server/test/services/completion/dart/location/super_formal_parameter_test.dart
index 88d16b9..a38465a 100644
--- a/pkg/analysis_server/test/services/completion/dart/super_formal_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/super_formal_parameter_test.dart
@@ -2,34 +2,39 @@
 // 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.
 
-import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
-import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
-import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
-import 'package:analysis_server/src/services/completion/dart/super_formal_contributor.dart';
 import 'package:analyzer_utilities/check/check.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'completion_check.dart';
-import 'completion_contributor_util.dart';
+import '../../../../client/completion_driver_test.dart';
+import '../completion_check.dart';
 
 void main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(SuperFormalContributorTest);
+    defineReflectiveTests(SuperFormalParameterTest1);
+    defineReflectiveTests(SuperFormalParameterTest2);
   });
 }
 
 @reflectiveTest
-class SuperFormalContributorTest extends DartCompletionContributorTest {
+class SuperFormalParameterTest1 extends AbstractCompletionDriverTest
+    with SuperFormalParameterTestCases {
   @override
-  DartCompletionContributor createContributor(
-    DartCompletionRequest request,
-    SuggestionBuilder builder,
-  ) {
-    return SuperFormalContributor(request, builder);
-  }
+  TestingCompletionProtocol get protocol => TestingCompletionProtocol.version1;
+}
+
+@reflectiveTest
+class SuperFormalParameterTest2 extends AbstractCompletionDriverTest
+    with SuperFormalParameterTestCases {
+  @override
+  TestingCompletionProtocol get protocol => TestingCompletionProtocol.version2;
+}
+
+mixin SuperFormalParameterTestCases on AbstractCompletionDriverTest {
+  @override
+  bool get supportsAvailableSuggestions => true;
 
   Future<void> test_explicit_optionalNamed_hasArgument_named() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A({int first, double second});
 }
@@ -39,7 +44,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -51,7 +55,7 @@
   }
 
   Future<void> test_explicit_optionalNamed_hasArgument_positional() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A({int first, double second});
 }
@@ -61,7 +65,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -78,7 +81,7 @@
 
   /// It is an error, but the user already typed `super.`, so maybe do it.
   Future<void> test_explicit_requiredPositional_hasArgument_positional() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A(int first, double second);
 }
@@ -88,7 +91,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -100,7 +102,7 @@
   }
 
   Future<void> test_explicitNamed_noOther() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A.named(int first, double second);
   A(int third)
@@ -111,7 +113,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -123,7 +124,7 @@
   }
 
   Future<void> test_implicit_optionalNamed_hasNamed_notSuper() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A({int first, double second});
 }
@@ -133,7 +134,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -149,7 +149,7 @@
   }
 
   Future<void> test_implicit_optionalNamed_hasNamed_notSuper2() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A({int first, double second});
 }
@@ -159,7 +159,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -171,7 +170,7 @@
   }
 
   Future<void> test_implicit_optionalNamed_hasNamed_super() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A({int first, double second});
 }
@@ -181,7 +180,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -193,7 +191,7 @@
   }
 
   Future<void> test_implicit_optionalNamed_hasNamed_super2() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A({int first, double second});
 }
@@ -203,7 +201,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -215,7 +212,7 @@
   }
 
   Future<void> test_implicit_optionalNamed_hasPositional_notSuper() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A({int first, double second});
 }
@@ -225,7 +222,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -241,7 +237,7 @@
   }
 
   Future<void> test_implicit_optionalNamed_hasPositional_super() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A({int first, double second});
 }
@@ -251,7 +247,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -263,7 +258,7 @@
   }
 
   Future<void> test_implicit_optionalNamed_noOther() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A(bool first, {int second, double third});
 }
@@ -273,7 +268,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -289,7 +283,7 @@
   }
 
   Future<void> test_implicit_optionalPositional_hasPositional_notSuper() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A([int first, double second]);
 }
@@ -299,7 +293,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -311,7 +304,7 @@
   }
 
   Future<void> test_implicit_optionalPositional_hasPositional_super() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A([int first, double second, bool third]);
 }
@@ -321,7 +314,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -333,7 +325,7 @@
   }
 
   Future<void> test_implicit_optionalPositional_hasPositional_super2() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A([int first, double second, bool third]);
 }
@@ -345,7 +337,6 @@
 
     // It does not matter what is the name of the positional parameter.
     // Here `super.second` consumes `int first`.
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -357,7 +348,7 @@
   }
 
   Future<void> test_implicit_optionalPositional_noOther() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A([int first, double second]);
 }
@@ -367,7 +358,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -379,7 +369,7 @@
   }
 
   Future<void> test_implicit_requiredPositional_hasPositional_notSuper() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A(int first, double second);
 }
@@ -389,7 +379,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -401,7 +390,7 @@
   }
 
   Future<void> test_implicit_requiredPositional_hasPositional_super() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A(int first, double second, bool third);
 }
@@ -411,7 +400,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -423,7 +411,7 @@
   }
 
   Future<void> test_implicit_requiredPositional_hasPositional_super2() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A(int first, double second, bool third);
 }
@@ -435,7 +423,6 @@
 
     // It does not matter what is the name of the positional parameter.
     // Here `super.second` consumes `int first`.
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
@@ -447,7 +434,7 @@
   }
 
   Future<void> test_implicit_requiredPositional_noOther() async {
-    addTestSource('''
+    var response = await getTestCodeSuggestions('''
 class A {
   A(int first, double second);
   A.named(int third);
@@ -458,7 +445,6 @@
 }
 ''');
 
-    var response = await computeSuggestions2();
     check(response)
       ..hasEmptyReplacement()
       ..suggestions.matchesInAnyOrder([
diff --git a/pkg/analysis_server/test/services/completion/dart/location/test_all.dart b/pkg/analysis_server/test/services/completion/dart/location/test_all.dart
new file mode 100644
index 0000000..66dc07d
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/dart/location/test_all.dart
@@ -0,0 +1,16 @@
+// 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.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'field_formal_parameter_test.dart' as field_formal_parameter;
+import 'super_formal_parameter_test.dart' as super_formal_parameter;
+
+/// Tests suggestions produced at specific locations.
+void main() {
+  defineReflectiveSuite(() {
+    field_formal_parameter.main();
+    super_formal_parameter.main();
+  });
+}
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_test.dart
index 018a020..ea4ec7e 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/named_argument_test.dart
@@ -32,14 +32,15 @@
 mixin NamedArgumentTestCases on CompletionRelevanceTest {
   @override
   Future<void> setUp() async {
-    await super.setUp();
-
     var metaLibFolder = MockPackages.instance.addMeta(resourceProvider);
 
-    newDotPackagesFile(projectPath, content: '''
+    // TODO(scheglov) Use `writeTestPackageConfig` instead
+    newDotPackagesFile(testPackageRootPath, content: '''
 meta:${metaLibFolder.toUri()}
-project:${toUri('$projectPath/lib')}
+project:${toUri(testPackageLibPath)}
 ''');
+
+    await super.setUp();
   }
 
   Future<void> test_required() async {
diff --git a/pkg/analysis_server/test/services/completion/dart/test_all.dart b/pkg/analysis_server/test/services/completion/dart/test_all.dart
index 0ed0678..29e4a22 100644
--- a/pkg/analysis_server/test/services/completion/dart/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/dart/test_all.dart
@@ -10,7 +10,6 @@
 import 'completion_manager_test.dart' as completion_manager;
 import 'declaration/test_all.dart' as declaration;
 import 'extension_member_contributor_test.dart' as extension_member_contributor;
-import 'field_formal_contributor_test.dart' as field_formal_contributor_test;
 import 'imported_reference_contributor_test.dart' as imported_ref_test;
 import 'keyword_contributor_test.dart' as keyword_test;
 import 'label_contributor_test.dart' as label_contributor_test;
@@ -18,11 +17,11 @@
 import 'library_prefix_contributor_test.dart' as library_prefix_test;
 import 'local_library_contributor_test.dart' as local_lib_test;
 import 'local_reference_contributor_test.dart' as local_ref_test;
+import 'location/test_all.dart' as location;
 import 'named_constructor_contributor_test.dart' as named_contributor_test;
 import 'override_contributor_test.dart' as override_contributor_test;
 import 'relevance/test_all.dart' as relevance_tests;
 import 'static_member_contributor_test.dart' as static_contributor_test;
-import 'super_formal_contributor_test.dart' as super_formal_contributor;
 import 'type_member_contributor_test.dart' as type_member_contributor_test;
 import 'uri_contributor_test.dart' as uri_contributor_test;
 import 'variable_name_contributor_test.dart' as variable_name_contributor_test;
@@ -35,7 +34,6 @@
     completion_manager.main();
     declaration.main();
     extension_member_contributor.main();
-    field_formal_contributor_test.main();
     imported_ref_test.main();
     keyword_test.main();
     label_contributor_test.main();
@@ -43,11 +41,11 @@
     library_prefix_test.main();
     local_lib_test.main();
     local_ref_test.main();
+    location.main();
     named_contributor_test.main();
     override_contributor_test.main();
     relevance_tests.main();
     static_contributor_test.main();
-    super_formal_contributor.main();
     type_member_contributor_test.main();
     uri_contributor_test.main();
     variable_name_contributor_test.main();
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 65409ce..a819b7f 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,6 @@
+## 3.3.0-dev
+* Added `getField` to `ExtensionElement`.
+
 ## 3.2.0
 * Deprecated `changes` getter in `File` and `Folder`, use `watch()` instead.
 
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 400e918..2ee4830 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -1145,6 +1145,11 @@
   /// Return a list containing all of the methods declared in this extension.
   List<MethodElement> get methods;
 
+  /// Return the element representing the field with the given [name] that is
+  /// declared in this extension, or `null` if this extension does not declare a
+  /// field with the given name.
+  FieldElement? getField(String name);
+
   /// Return the element representing the getter with the given [name] that is
   /// declared in this extension, or `null` if this extension does not declare a
   /// getter with the given name.
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 165e57f..fe3cd92 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -82,7 +82,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 201;
+  static const int DATA_VERSION = 204;
 
   /// 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/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 347e551..62a49f0 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -956,8 +956,16 @@
         return true;
       }
 
-      // We have a contributor that looks at the type, but it is syntactic.
       if (parent is FormalParameter && parent.identifier == node) {
+        // We use elements to access fields.
+        if (parent is FieldFormalParameter) {
+          return false;
+        }
+        // We use elements to access the enclosing constructor.
+        if (parent is SuperFormalParameter) {
+          return false;
+        }
+        // We have a contributor that looks at the type, but it is syntactic.
         return true;
       }
 
diff --git a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
index 2e58795..77422fc 100644
--- a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
@@ -74,6 +74,8 @@
     _write('enum ');
     _write(element.displayName);
     _writeTypeParameters(element.typeParameters);
+    _writeTypesIfNotEmpty(' with ', element.mixins);
+    _writeTypesIfNotEmpty(' implements ', element.interfaces);
   }
 
   void writeExecutableElement(ExecutableElement element, String name) {
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index b79c1a0..df1d7da 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -48,6 +48,17 @@
 abstract class AbstractClassElementImpl extends _ExistingElementImpl
     with TypeParameterizedElementMixin
     implements ClassElement {
+  /// The superclass of the class, or `null` for [Object].
+  InterfaceType? _supertype;
+
+  /// A list containing all of the mixins that are applied to the class being
+  /// extended in order to derive the superclass of this class.
+  List<InterfaceType> _mixins = const [];
+
+  /// A list containing all of the interfaces that are implemented by this
+  /// class.
+  List<InterfaceType> _interfaces = const [];
+
   /// The type defined by the class.
   InterfaceType? _thisType;
 
@@ -61,6 +72,10 @@
   /// A list containing all of the methods contained in this class.
   List<MethodElement> _methods = _Sentinel.methodElement;
 
+  /// This callback is set during mixins inference to handle reentrant calls.
+  List<InterfaceType>? Function(AbstractClassElementImpl)?
+      mixinInferenceCallback;
+
   /// Initialize a newly created class element to have the given [name] at the
   /// given [offset] in the file that contains the declaration of this element.
   AbstractClassElementImpl(String name, int offset) : super(name, offset);
@@ -75,6 +90,12 @@
   }
 
   @override
+  List<InterfaceType> get allSupertypes {
+    var sessionImpl = library.session as AnalysisSessionImpl;
+    return sessionImpl.classHierarchy.implementedInterfaces(this);
+  }
+
+  @override
   String get displayName => name;
 
   @override
@@ -92,6 +113,18 @@
   }
 
   @override
+  List<InterfaceType> get interfaces =>
+      ElementTypeProvider.current.getClassInterfaces(this);
+
+  set interfaces(List<InterfaceType> interfaces) {
+    _interfaces = interfaces;
+  }
+
+  List<InterfaceType> get interfacesInternal {
+    return _interfaces;
+  }
+
+  @override
   bool get isDartCoreObject => false;
 
   @override
@@ -101,9 +134,40 @@
   bool get isMixin => false;
 
   @override
+  List<InterfaceType> get mixins {
+    if (mixinInferenceCallback != null) {
+      var mixins = mixinInferenceCallback!(this);
+      if (mixins != null) {
+        return _mixins = mixins;
+      }
+    }
+
+    return _mixins;
+  }
+
+  set mixins(List<InterfaceType> mixins) {
+    _mixins = mixins;
+  }
+
+  @override
   List<InterfaceType> get superclassConstraints => const <InterfaceType>[];
 
   @override
+  InterfaceType? get supertype {
+    if (_supertype != null) return _supertype!;
+
+    if (hasModifier(Modifier.DART_CORE_OBJECT)) {
+      return null;
+    }
+
+    return _supertype;
+  }
+
+  set supertype(InterfaceType? supertype) {
+    _supertype = supertype;
+  }
+
+  @override
   InterfaceType get thisType {
     if (_thisType == null) {
       List<DartType> typeArguments;
@@ -444,17 +508,6 @@
 
 /// An [AbstractClassElementImpl] which is a class.
 class ClassElementImpl extends AbstractClassElementImpl {
-  /// The superclass of the class, or `null` for [Object].
-  InterfaceType? _supertype;
-
-  /// A list containing all of the mixins that are applied to the class being
-  /// extended in order to derive the superclass of this class.
-  List<InterfaceType> _mixins = const [];
-
-  /// A list containing all of the interfaces that are implemented by this
-  /// class.
-  List<InterfaceType> _interfaces = const [];
-
   /// For classes which are not mixin applications, a list containing all of the
   /// constructors contained in this class, or `null` if the list of
   /// constructors has not yet been built.
@@ -468,9 +521,6 @@
   /// of this class have been inferred.
   bool hasBeenInferred = false;
 
-  /// This callback is set during mixins inference to handle reentrant calls.
-  List<InterfaceType>? Function(ClassElementImpl)? mixinInferenceCallback;
-
   ElementLinkedData? linkedData;
 
   /// Initialize a newly created class element to have the given [name] at the
@@ -493,12 +543,6 @@
   }
 
   @override
-  List<InterfaceType> get allSupertypes {
-    var sessionImpl = library.session as AnalysisSessionImpl;
-    return sessionImpl.classHierarchy.implementedInterfaces(this);
-  }
-
-  @override
   List<ConstructorElement> get constructors {
     if (!identical(_constructors, _Sentinel.constructorElement)) {
       return _constructors;
@@ -611,13 +655,6 @@
   }
 
   @override
-  List<InterfaceType> get interfaces =>
-      ElementTypeProvider.current.getClassInterfaces(this);
-
-  set interfaces(List<InterfaceType> interfaces) {
-    _interfaces = interfaces;
-  }
-
   List<InterfaceType> get interfacesInternal {
     linkedData?.read(this);
     return _interfaces;
@@ -740,19 +777,8 @@
 
   @override
   List<InterfaceType> get mixins {
-    if (mixinInferenceCallback != null) {
-      var mixins = mixinInferenceCallback!(this);
-      if (mixins != null) {
-        return _mixins = mixins;
-      }
-    }
-
     linkedData?.read(this);
-    return _mixins;
-  }
-
-  set mixins(List<InterfaceType> mixins) {
-    _mixins = mixins;
+    return super.mixins;
   }
 
   @override
@@ -768,17 +794,7 @@
   @override
   InterfaceType? get supertype {
     linkedData?.read(this);
-    if (_supertype != null) return _supertype!;
-
-    if (hasModifier(Modifier.DART_CORE_OBJECT)) {
-      return null;
-    }
-
-    return _supertype;
-  }
-
-  set supertype(InterfaceType? supertype) {
-    _supertype = supertype;
+    return super.supertype;
   }
 
   @override
@@ -2675,10 +2691,6 @@
     return _accessors;
   }
 
-  @override
-  List<InterfaceType> get allSupertypes =>
-      <InterfaceType>[...interfaces, supertype];
-
   List<FieldElement> get constants {
     return fields.where((field) => field.isEnumConstant).toList();
   }
@@ -2707,9 +2719,6 @@
   bool get hasStaticMember => true;
 
   @override
-  List<InterfaceType> get interfaces => const [];
-
-  @override
   bool get isAbstract => false;
 
   @override
@@ -2753,17 +2762,14 @@
   }
 
   @override
-  List<InterfaceType> get mixins => const <InterfaceType>[];
-
-  @override
   String get name {
     return super.name!;
   }
 
   @override
-  InterfaceType get supertype {
-    var enumType = library.typeProvider.enumType;
-    return enumType ?? library.typeProvider.objectType;
+  InterfaceType? get supertype {
+    linkedData?.read(this);
+    return super.supertype;
   }
 
   @override
@@ -3128,6 +3134,16 @@
   }
 
   @override
+  FieldElement? getField(String name) {
+    for (FieldElement fieldElement in fields) {
+      if (name == fieldElement.name) {
+        return fieldElement;
+      }
+    }
+    return null;
+  }
+
+  @override
   PropertyAccessorElement? getGetter(String getterName) {
     int length = accessors.length;
     for (int i = 0; i < length; i++) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
index 192c94c..578cfdf 100644
--- a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
@@ -12,15 +12,19 @@
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
+import 'package:analyzer/src/dart/resolver/instance_creation_resolver_helper.dart';
 import 'package:analyzer/src/dart/resolver/invocation_inference_helper.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 
-class AnnotationResolver {
+class AnnotationResolver with InstanceCreationResolverMixin {
   final ResolverVisitor _resolver;
 
   AnnotationResolver(this._resolver);
 
+  @override
+  ResolverVisitor get resolver => _resolver;
+
   LibraryElement get _definingLibrary => _resolver.definingLibrary;
 
   ErrorReporter get _errorReporter => _resolver.errorReporter;
@@ -213,13 +217,21 @@
       return;
     }
 
-    _resolver.visitArgumentList(argumentList,
-        whyNotPromotedList: whyNotPromotedList);
-
     var elementToInfer = ConstructorElementToInfer(
       typeParameters,
       constructorElement,
     );
+    inferArgumentTypes(
+        inferenceNode: node,
+        constructorElement: constructorElement,
+        elementToInfer: elementToInfer,
+        typeArguments: node.typeArguments,
+        arguments: node.arguments!,
+        errorNode: node,
+        isConst: true);
+    _resolver.visitArgumentList(argumentList,
+        whyNotPromotedList: whyNotPromotedList);
+
     var constructorRawType = elementToInfer.asType;
 
     var inferred = _resolver.inferenceHelper.inferGenericInvoke(
diff --git a/pkg/analyzer/lib/src/dart/resolver/instance_creation_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/instance_creation_expression_resolver.dart
index 625037b..2ff2199 100644
--- a/pkg/analyzer/lib/src/dart/resolver/instance_creation_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/instance_creation_expression_resolver.dart
@@ -3,9 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/dart/resolver/instance_creation_resolver_helper.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 
 /// A resolver for [InstanceCreationExpression] nodes.
@@ -14,12 +13,15 @@
 /// [InstanceCreationExpression] as a [MethodInvocation] if the parsed
 /// [ConstructorName]'s `type` resolves to a [FunctionReference] or
 /// [ConstructorReference], instead of a [NamedType].
-class InstanceCreationExpressionResolver {
+class InstanceCreationExpressionResolver with InstanceCreationResolverMixin {
   /// The resolver driving this participant.
   final ResolverVisitor _resolver;
 
   InstanceCreationExpressionResolver(this._resolver);
 
+  @override
+  ResolverVisitor get resolver => _resolver;
+
   void resolve(InstanceCreationExpressionImpl node) {
     // The parser can parse certain code as [InstanceCreationExpression] when it
     // might be an invocation of a method on a [FunctionReference] or
@@ -48,76 +50,29 @@
     _resolveInstanceCreationExpression(node);
   }
 
-  void _inferArgumentTypes(covariant InstanceCreationExpressionImpl node) {
+  void _resolveInstanceCreationExpression(InstanceCreationExpressionImpl node) {
+    var whyNotPromotedList = <WhyNotPromotedGetter>[];
     var constructorName = node.constructorName;
-    var typeName = constructorName.type2;
-    var typeArguments = typeName.typeArguments;
+    constructorName.accept(_resolver);
+    // Re-assign constructorName in case the node got replaced.
+    constructorName = node.constructorName;
     var elementToInfer = _resolver.inferenceHelper.constructorElementToInfer(
       constructorName: constructorName,
       definingLibrary: _resolver.definingLibrary,
     );
-    FunctionType? inferred;
-
-    // If the constructor is generic, we'll have a ConstructorMember that
-    // substitutes in type arguments (possibly `dynamic`) from earlier in
-    // resolution.
-    //
-    // Otherwise we'll have a ConstructorElement, and we can skip inference
-    // because there's nothing to infer in a non-generic type.
-    if (elementToInfer != null) {
-      // TODO(leafp): Currently, we may re-infer types here, since we
-      // sometimes resolve multiple times.  We should really check that we
-      // have not already inferred something.  However, the obvious ways to
-      // check this don't work, since we may have been instantiated
-      // to bounds in an earlier phase, and we *do* want to do inference
-      // in that case.
-
-      // Get back to the uninstantiated generic constructor.
-      // TODO(jmesserly): should we store this earlier in resolution?
-      // Or look it up, instead of jumping backwards through the Member?
-      var rawElement = elementToInfer.element;
-      var constructorType = elementToInfer.asType;
-
-      inferred = _resolver.inferenceHelper.inferArgumentTypesForGeneric(
-          node, constructorType, typeArguments,
-          isConst: node.isConst, errorNode: node.constructorName);
-
-      if (inferred != null) {
-        var arguments = node.argumentList;
-        InferenceContext.setType(arguments, inferred);
-        // Fix up the parameter elements based on inferred method.
-        arguments.correspondingStaticParameters =
-            ResolverVisitor.resolveArgumentsToParameters(
-          argumentList: arguments,
-          parameters: inferred.parameters,
-        );
-
-        constructorName.type2.type = inferred.returnType;
-
-        // Update the static element as well. This is used in some cases, such
-        // as computing constant values. It is stored in two places.
-        var constructorElement = ConstructorMember.from(
-          rawElement,
-          inferred.returnType as InterfaceType,
-        );
-        constructorName.staticElement = constructorElement;
-      }
+    var typeName = constructorName.type2;
+    var inferenceResult = inferArgumentTypes(
+        inferenceNode: node,
+        constructorElement: constructorName.staticElement,
+        elementToInfer: elementToInfer,
+        typeArguments: typeName.typeArguments,
+        arguments: node.argumentList,
+        errorNode: constructorName,
+        isConst: node.isConst);
+    if (inferenceResult != null) {
+      typeName.type = inferenceResult.constructedType;
+      constructorName.staticElement = inferenceResult.constructorElement;
     }
-
-    if (inferred == null) {
-      var constructorElement = constructorName.staticElement;
-      if (constructorElement != null) {
-        var type = constructorElement.type;
-        type = _resolver.toLegacyTypeIfOptOut(type) as FunctionType;
-        InferenceContext.setType(node.argumentList, type);
-      }
-    }
-  }
-
-  void _resolveInstanceCreationExpression(InstanceCreationExpressionImpl node) {
-    var whyNotPromotedList = <WhyNotPromotedGetter>[];
-    node.constructorName.accept(_resolver);
-    _inferArgumentTypes(node);
     _resolver.visitArgumentList(node.argumentList,
         whyNotPromotedList: whyNotPromotedList);
     _resolver.elementResolver.visitInstanceCreationExpression(node);
diff --git a/pkg/analyzer/lib/src/dart/resolver/instance_creation_resolver_helper.dart b/pkg/analyzer/lib/src/dart/resolver/instance_creation_resolver_helper.dart
new file mode 100644
index 0000000..9177b2b
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/resolver/instance_creation_resolver_helper.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2021, 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.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/dart/resolver/invocation_inference_helper.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+
+/// Data constructor containing information about the result of performing type
+/// inference on an instance creation (either an InstanceCreationExpression or
+/// an Annotation that refers to a constructor).
+class InstanceCreationInferenceResult {
+  /// The refined constructor element (after type inference)
+  final ConstructorElement constructorElement;
+
+  /// The type that was constructed (after type inference)
+  final DartType constructedType;
+
+  InstanceCreationInferenceResult(
+      {required this.constructorElement, required this.constructedType});
+}
+
+/// Mixin containing shared functionality for resolving AST nodes that may
+/// create instances (InstanceCreationExpression and Annotation).
+mixin InstanceCreationResolverMixin {
+  ResolverVisitor get resolver;
+
+  /// Performs the first step of type inference for a constructor invocation.
+  InstanceCreationInferenceResult? inferArgumentTypes(
+      {required AstNode inferenceNode,
+      required ConstructorElement? constructorElement,
+      required ConstructorElementToInfer? elementToInfer,
+      required TypeArgumentListImpl? typeArguments,
+      required ArgumentListImpl arguments,
+      required AstNode errorNode,
+      required bool isConst}) {
+    InstanceCreationInferenceResult? inferenceResult;
+    FunctionType? inferred;
+
+    // If the constructor is generic, we'll have a ConstructorMember that
+    // substitutes in type arguments (possibly `dynamic`) from earlier in
+    // resolution.
+    //
+    // Otherwise we'll have a ConstructorElement, and we can skip inference
+    // because there's nothing to infer in a non-generic type.
+    if (elementToInfer != null) {
+      // TODO(leafp): Currently, we may re-infer types here, since we
+      // sometimes resolve multiple times.  We should really check that we
+      // have not already inferred something.  However, the obvious ways to
+      // check this don't work, since we may have been instantiated
+      // to bounds in an earlier phase, and we *do* want to do inference
+      // in that case.
+
+      // Get back to the uninstantiated generic constructor.
+      // TODO(jmesserly): should we store this earlier in resolution?
+      // Or look it up, instead of jumping backwards through the Member?
+      var rawElement = elementToInfer.element;
+      var constructorType = elementToInfer.asType;
+
+      inferred = resolver.inferenceHelper.inferArgumentTypesForGeneric(
+          inferenceNode, constructorType, typeArguments,
+          isConst: isConst, errorNode: errorNode);
+
+      if (inferred != null) {
+        InferenceContext.setType(arguments, inferred);
+        // Fix up the parameter elements based on inferred method.
+        arguments.correspondingStaticParameters =
+            ResolverVisitor.resolveArgumentsToParameters(
+          argumentList: arguments,
+          parameters: inferred.parameters,
+        );
+
+        // Update the static element as well. This is used in some cases, such
+        // as computing constant values. It is stored in two places.
+        constructorElement = ConstructorMember.from(
+          rawElement,
+          inferred.returnType as InterfaceType,
+        );
+        inferenceResult = InstanceCreationInferenceResult(
+            constructorElement: constructorElement,
+            constructedType: inferred.returnType);
+      }
+    }
+
+    if (inferred == null) {
+      if (constructorElement != null) {
+        var type = constructorElement.type;
+        type = resolver.toLegacyTypeIfOptOut(type) as FunctionType;
+        InferenceContext.setType(arguments, type);
+      }
+    }
+
+    return inferenceResult;
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
index 4a1e23d..65abd1c 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
@@ -50,7 +50,11 @@
     }
 
     DartType type = DynamicTypeImpl.instance;
-    if (element is ClassElement) {
+    if (result.readElementRequested == null &&
+        result.readElementRecovery != null) {
+      // Since the element came from error recovery logic, its type isn't
+      // trustworthy; leave it as `dynamic`.
+    } else if (element is ClassElement) {
       if (_isExpressionIdentifier(node)) {
         var type = _typeProvider.typeType;
         node.staticType = type;
diff --git a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
index d0f35da..8e8bce1 100644
--- a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
@@ -253,17 +253,20 @@
   }
 
   /// If the [element] is not static, report the error on the [identifier].
-  void _checkForStaticAccessToInstanceMember(
+  ///
+  /// Returns `true` if an error was reported.
+  bool _checkForStaticAccessToInstanceMember(
     SimpleIdentifier identifier,
     ExecutableElement element,
   ) {
-    if (element.isStatic) return;
+    if (element.isStatic) return false;
 
     _errorReporter.reportErrorForNode(
       CompileTimeErrorCode.STATIC_ACCESS_TO_INSTANCE_MEMBER,
       identifier,
       [identifier.name],
     );
+    return true;
   }
 
   void _checkForStaticMember(
@@ -494,6 +497,7 @@
     }
 
     ExecutableElement? readElement;
+    ExecutableElement? readElementRecovery;
     if (hasRead) {
       readElement = typeReference.getGetter(propertyName.name);
       if (readElement != null && !_isAccessible(readElement)) {
@@ -509,7 +513,10 @@
 
       if (readElement != null) {
         readElement = _resolver.toLegacyElement(readElement);
-        _checkForStaticAccessToInstanceMember(propertyName, readElement);
+        if (_checkForStaticAccessToInstanceMember(propertyName, readElement)) {
+          readElementRecovery = readElement;
+          readElement = null;
+        }
       } else {
         var code = typeReference.isEnum
             ? CompileTimeErrorCode.UNDEFINED_ENUM_CONSTANT
@@ -535,7 +542,10 @@
             [propertyName.name],
           );
         }
-        _checkForStaticAccessToInstanceMember(propertyName, writeElement);
+        if (_checkForStaticAccessToInstanceMember(propertyName, writeElement)) {
+          writeElementRecovery = writeElement;
+          writeElement = null;
+        }
       } else {
         // Recovery, try to use getter.
         writeElementRecovery = typeReference.getGetter(propertyName.name);
@@ -550,6 +560,7 @@
 
     return PropertyElementResolverResult(
       readElementRequested: readElement,
+      readElementRecovery: readElementRecovery,
       writeElementRequested: writeElement,
       writeElementRecovery: writeElementRecovery,
     );
@@ -564,6 +575,7 @@
     var memberName = propertyName.name;
 
     ExecutableElement? readElement;
+    ExecutableElement? readElementRecovery;
     if (hasRead) {
       readElement ??= extension.getGetter(memberName);
       readElement ??= extension.getMethod(memberName);
@@ -579,11 +591,15 @@
         );
       } else {
         readElement = _resolver.toLegacyElement(readElement);
-        _checkForStaticAccessToInstanceMember(propertyName, readElement);
+        if (_checkForStaticAccessToInstanceMember(propertyName, readElement)) {
+          readElementRecovery = readElement;
+          readElement = null;
+        }
       }
     }
 
     ExecutableElement? writeElement;
+    ExecutableElement? writeElementRecovery;
     if (hasWrite) {
       writeElement = extension.getSetter(memberName);
 
@@ -598,13 +614,18 @@
         );
       } else {
         writeElement = _resolver.toLegacyElement(writeElement);
-        _checkForStaticAccessToInstanceMember(propertyName, writeElement);
+        if (_checkForStaticAccessToInstanceMember(propertyName, writeElement)) {
+          writeElementRecovery = writeElement;
+          writeElement = null;
+        }
       }
     }
 
     return PropertyElementResolverResult(
       readElementRequested: readElement,
+      readElementRecovery: readElementRecovery,
       writeElementRequested: writeElement,
+      writeElementRecovery: writeElementRecovery,
     );
   }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 7145bd0..d41a3b6 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -409,6 +409,7 @@
   void visitEnumDeclaration(covariant EnumDeclarationImpl node) {
     EnumElementImpl element = _elementWalker!.getEnum();
     node.name.staticElement = element;
+    _namedTypeResolver.enclosingClass = element;
 
     node.metadata.accept(this);
     _setElementAnnotations(node.metadata, element.metadata);
@@ -418,12 +419,17 @@
         _buildTypeParameterElements(node.typeParameters);
         node.typeParameters?.accept(this);
 
+        _resolveWithClause(node.withClause);
+        _resolveImplementsClause(node.implementsClause);
+
         _defineElements(element.accessors);
         _defineElements(element.methods);
         node.constants.accept(this);
         node.members.accept(this);
       });
     });
+
+    _namedTypeResolver.enclosingClass = null;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/element_type_provider.dart b/pkg/analyzer/lib/src/generated/element_type_provider.dart
index ba2554c..c089385 100644
--- a/pkg/analyzer/lib/src/generated/element_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/element_type_provider.dart
@@ -32,7 +32,7 @@
   void freshTypeParameterCreated(TypeParameterElement newTypeParameter,
       TypeParameterElement oldTypeParameter) {}
 
-  List<InterfaceType> getClassInterfaces(ClassElementImpl element) =>
+  List<InterfaceType> getClassInterfaces(AbstractClassElementImpl element) =>
       element.interfacesInternal;
 
   /// Queries the parameters of an executable element's signature.
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 53915eb..6400c29 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -276,6 +276,9 @@
       unitElement: element.enclosingElement,
     );
     _readTypeParameters(reader, element.typeParameters);
+    element.supertype = reader._readOptionalInterfaceType();
+    element.mixins = reader._readInterfaceTypeList();
+    element.interfaces = reader._readInterfaceTypeList();
     applyConstantOffsets?.perform();
   }
 }
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index 489d45d..6cc91be 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -176,6 +176,10 @@
     _resolutionSink._writeAnnotationList(element.metadata);
 
     _writeTypeParameters(element.typeParameters, () {
+      _resolutionSink.writeType(element.supertype);
+      _resolutionSink._writeTypeList(element.mixins);
+      _resolutionSink._writeTypeList(element.interfaces);
+
       _writeList(
         element.fields.where((e) {
           return !e.isSynthetic ||
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 667c275..971a7f1 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -339,10 +339,8 @@
       holder.addNonSyntheticField(valuesField);
     }
 
-    // TODO(scheglov) implement
-    // node.extendsClause?.accept(this);
-    // node.withClause?.accept(this);
-    // node.implementsClause?.accept(this);
+    node.withClause?.accept(this);
+    node.implementsClause?.accept(this);
 
     // Build the 'index' field.
     var indexField = ConstFieldElementImpl('index', -1)
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index aa57e1e..e6caec3 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -134,6 +134,8 @@
   void buildEnumChildren() {
     var typeProvider = element.typeProvider;
     for (var enum_ in implicitEnumNodes) {
+      enum_.element.supertype =
+          typeProvider.enumType ?? typeProvider.objectType;
       enum_.indexField.type = typeProvider.intType;
       var valuesType = typeProvider.listType(
         element.typeSystem.instantiateToBounds2(
diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
index dd5b4cc..57e276a 100644
--- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
@@ -122,10 +122,8 @@
     scope = TypeParameterScope(scope, element.typeParameters);
 
     node.typeParameters?.accept(this);
-    // TODO(scheglov) implement
-    // node.extendsClause?.accept(this);
-    // node.implementsClause?.accept(this);
-    // node.withClause?.accept(this);
+    node.implementsClause?.accept(this);
+    node.withClause?.accept(this);
 
     scope = ClassScope(scope, element);
     LinkingNodeContext(node, scope);
diff --git a/pkg/analyzer/lib/src/summary2/types_builder.dart b/pkg/analyzer/lib/src/summary2/types_builder.dart
index 795d229..03daeed 100644
--- a/pkg/analyzer/lib/src/summary2/types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/types_builder.dart
@@ -223,7 +223,15 @@
   }
 
   void _enumDeclaration(EnumDeclaration node) {
-    // TODO(scheglov) implement
+    var element = node.declaredElement as EnumElementImpl;
+
+    element.mixins = _toInterfaceTypeList(
+      node.withClause?.mixinTypes2,
+    );
+
+    element.interfaces = _toInterfaceTypeList(
+      node.implementsClause?.interfaces2,
+    );
   }
 
   void _extensionDeclaration(ExtensionDeclaration node) {
@@ -362,7 +370,7 @@
 
 /// Performs mixins inference in a [ClassDeclaration].
 class _MixinInference {
-  final ClassElementImpl element;
+  final AbstractClassElementImpl element;
   final TypeSystemImpl typeSystem;
   final FeatureSet featureSet;
   final InterfaceType classType;
@@ -512,14 +520,15 @@
   /// we are inferring the [element] now, i.e. there is a loop.
   ///
   /// This is an error. So, we return the empty list, and break the loop.
-  List<InterfaceType> _callbackWhenLoop(ClassElementImpl element) {
+  List<InterfaceType> _callbackWhenLoop(AbstractClassElementImpl element) {
     element.mixinInferenceCallback = null;
     return <InterfaceType>[];
   }
 
   /// This method is invoked when mixins are asked from the [element], and
   /// we are not inferring the [element] now, i.e. there is no loop.
-  List<InterfaceType>? _callbackWhenRecursion(ClassElementImpl element) {
+  List<InterfaceType>? _callbackWhenRecursion(
+      AbstractClassElementImpl element) {
     var node = _linker.getLinkingNode(element);
     if (node != null) {
       _inferDeclaration(node);
@@ -528,7 +537,7 @@
     return null;
   }
 
-  void _infer(ClassElementImpl element, WithClause? withClause) {
+  void _infer(AbstractClassElementImpl element, WithClause? withClause) {
     if (withClause != null) {
       element.mixinInferenceCallback = _callbackWhenLoop;
       try {
@@ -550,6 +559,9 @@
     } else if (node is ClassTypeAlias) {
       var element = node.declaredElement as ClassElementImpl;
       _infer(element, node.withClause);
+    } else if (node is EnumDeclaration) {
+      var element = node.declaredElement as EnumElementImpl;
+      _infer(element, node.withClause);
     }
   }
 
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element.dart b/pkg/analyzer/lib/src/test_utilities/find_element.dart
index 7159665..4a4b593 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_element.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_element.dart
@@ -5,6 +5,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/test_utilities/function_ast_visitor.dart';
+import 'package:collection/src/iterable_extensions.dart';
 
 /// Helper for finding elements declared in the resolved [unit].
 class FindElement extends _FindElementBase {
@@ -406,147 +407,27 @@
   }
 
   FieldElement field(String name, {String? of}) {
-    FieldElement? result;
-
-    void findIn(List<FieldElement> fields) {
-      for (var field in fields) {
-        if (field.name == name) {
-          if (result != null) {
-            throw StateError('Not unique: $name');
-          }
-          result = field;
-        }
-      }
-    }
-
-    for (var enum_ in unitElement.enums) {
-      if (of != null && enum_.name != of) {
-        continue;
-      }
-      findIn(enum_.fields);
-    }
-
-    for (var class_ in unitElement.classes) {
-      if (of != null && class_.name != of) {
-        continue;
-      }
-      findIn(class_.fields);
-    }
-
-    for (var mixin in unitElement.mixins) {
-      if (of != null && mixin.name != of) {
-        continue;
-      }
-      findIn(mixin.fields);
-    }
-
-    for (var extension in unitElement.extensions) {
-      if (of != null && extension.name != of) {
-        continue;
-      }
-      findIn(extension.fields);
-    }
-
-    if (result != null) {
-      return result!;
-    }
-    throw StateError('Not found: $name');
+    return _findInClassesLike(
+      className: of,
+      fromClass: (element) => element.getField(name),
+      fromExtension: (element) => element.getField(name),
+    );
   }
 
   PropertyAccessorElement getter(String name, {String? of}) {
-    PropertyAccessorElement? result;
-
-    void findIn(List<PropertyAccessorElement> accessors) {
-      for (var accessor in accessors) {
-        if (accessor.isGetter && accessor.displayName == name) {
-          if (result != null) {
-            throw StateError('Not unique: $name');
-          }
-          result = accessor;
-        }
-      }
-    }
-
-    for (var enum_ in unitElement.enums) {
-      if (of != null && enum_.name != of) {
-        continue;
-      }
-      findIn(enum_.accessors);
-    }
-
-    for (var extension_ in unitElement.extensions) {
-      if (of != null && extension_.name != of) {
-        continue;
-      }
-      findIn(extension_.accessors);
-    }
-
-    for (var class_ in unitElement.classes) {
-      if (of != null && class_.name != of) {
-        continue;
-      }
-      findIn(class_.accessors);
-    }
-
-    for (var mixin in unitElement.mixins) {
-      if (of != null && mixin.name != of) {
-        continue;
-      }
-      findIn(mixin.accessors);
-    }
-
-    if (result != null) {
-      return result!;
-    }
-    throw StateError('Not found: $name');
+    return _findInClassesLike(
+      className: of,
+      fromClass: (element) => element.getGetter(name),
+      fromExtension: (element) => element.getGetter(name),
+    );
   }
 
   MethodElement method(String name, {String? of}) {
-    MethodElement? result;
-
-    void findIn(List<MethodElement> methods) {
-      for (var method in methods) {
-        if (method.name == name) {
-          if (result != null) {
-            throw StateError('Not unique: $name');
-          }
-          result = method;
-        }
-      }
-    }
-
-    for (var class_ in unitElement.classes) {
-      if (of != null && class_.name != of) {
-        continue;
-      }
-      findIn(class_.methods);
-    }
-
-    for (var enum_ in unitElement.enums) {
-      if (of != null && enum_.name != of) {
-        continue;
-      }
-      findIn(enum_.methods);
-    }
-
-    for (var extension_ in unitElement.extensions) {
-      if (of != null && extension_.name != of) {
-        continue;
-      }
-      findIn(extension_.methods);
-    }
-
-    for (var mixin in unitElement.mixins) {
-      if (of != null && mixin.name != of) {
-        continue;
-      }
-      findIn(mixin.methods);
-    }
-
-    if (result != null) {
-      return result!;
-    }
-    throw StateError('Not found: $name');
+    return _findInClassesLike(
+      className: of,
+      fromClass: (element) => element.getMethod(name),
+      fromExtension: (element) => element.getMethod(name),
+    );
   }
 
   ClassElement mixin(String name) {
@@ -581,44 +462,11 @@
   }
 
   PropertyAccessorElement setter(String name, {String? of}) {
-    PropertyAccessorElement? result;
-
-    void findIn(List<PropertyAccessorElement> accessors) {
-      for (var accessor in accessors) {
-        if (accessor.isSetter && accessor.displayName == name) {
-          if (result != null) {
-            throw StateError('Not unique: $name');
-          }
-          result = accessor;
-        }
-      }
-    }
-
-    for (var extension_ in unitElement.extensions) {
-      if (of != null && extension_.name != of) {
-        continue;
-      }
-      findIn(extension_.accessors);
-    }
-
-    for (var class_ in unitElement.classes) {
-      if (of != null && class_.name != of) {
-        continue;
-      }
-      findIn(class_.accessors);
-    }
-
-    for (var mixin in unitElement.mixins) {
-      if (of != null && mixin.name != of) {
-        continue;
-      }
-      findIn(mixin.accessors);
-    }
-
-    if (result != null) {
-      return result!;
-    }
-    throw StateError('Not found: $name');
+    return _findInClassesLike(
+      className: of,
+      fromClass: (element) => element.getSetter(name),
+      fromExtension: (element) => element.getSetter(name),
+    );
   }
 
   FunctionElement topFunction(String name) {
@@ -659,6 +507,38 @@
   ConstructorElement unnamedConstructor(String name) {
     return class_(name).unnamedConstructor!;
   }
+
+  T _findInClassesLike<T extends Element>({
+    required String? className,
+    required T? Function(ClassElement element) fromClass,
+    required T? Function(ExtensionElement element) fromExtension,
+  }) {
+    bool filter(Element element) {
+      return className == null || element.name == className;
+    }
+
+    var classes = [
+      ...unitElement.classes,
+      ...unitElement.enums,
+      ...unitElement.mixins,
+    ];
+
+    var results = [
+      ...classes.where(filter).map(fromClass),
+      ...unitElement.extensions.where(filter).map(fromExtension),
+    ].whereNotNull().toList();
+
+    var result = results.singleOrNull;
+    if (result != null) {
+      return result;
+    }
+
+    if (results.isEmpty) {
+      throw StateError('Not found');
+    } else {
+      throw StateError('Not unique');
+    }
+  }
 }
 
 extension ExecutableElementExtensions on ExecutableElement {
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 5994057..424d0ce 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 3.2.0
+version: 3.3.0-dev
 description: This package provides a library that performs static analysis of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/main/pkg/analyzer
 
diff --git a/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart b/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart
index e241371..c8395fc 100644
--- a/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/resolve_for_completion_test.dart
@@ -152,6 +152,19 @@
     ]);
   }
 
+  test_constructorDeclaration_fieldFormalParameter_name() async {
+    var result = _resolveTestCode(r'''
+class A {
+  final int f;
+  A(this.^);
+}
+''');
+
+    result.assertResolvedNodes([
+      'A(this.);',
+    ]);
+  }
+
   test_constructorDeclaration_fieldInitializer_name() async {
     var result = _resolveTestCode(r'''
 class A {}
@@ -201,6 +214,23 @@
     result.assertResolvedNodes([]);
   }
 
+  test_constructorDeclaration_superFormalParameter_name() async {
+    var result = _resolveTestCode(r'''
+class A {
+  A(int first, double second);
+  A.named(int third);
+}
+
+class B extends A {
+  B(super.^);
+}
+''');
+
+    result.assertResolvedNodes([
+      'B(super.);',
+    ]);
+  }
+
   test_doubleLiteral() async {
     var result = _resolveTestCode(r'''
 var v = 1.2^;
diff --git a/pkg/analyzer/test/src/dart/resolution/dart_object_printer.dart b/pkg/analyzer/test/src/dart/resolution/dart_object_printer.dart
index ccb6a78..5514beb 100644
--- a/pkg/analyzer/test/src/dart/resolution/dart_object_printer.dart
+++ b/pkg/analyzer/test/src/dart/resolution/dart_object_printer.dart
@@ -4,6 +4,7 @@
 
 import 'dart:collection';
 
+import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/constant/value.dart';
 
 /// Prints [DartObjectImpl] as a tree, with values and fields.
@@ -24,6 +25,17 @@
       } else if (type.isDartCoreString) {
         sink.write('String ');
         sink.writeln(object.toStringValue());
+      } else if (type.isDartCoreList) {
+        var newIndent = '$indent  ';
+        sink.writeln('List');
+        sink.write(newIndent);
+        sink.writeln(
+            'elementType: ${(type as InterfaceType).typeArguments[0]}');
+        var elements = object.toListValue()!;
+        for (int i = 0; i < elements.length; i++) {
+          sink.write(newIndent);
+          write(elements[i] as DartObjectImpl, newIndent);
+        }
       } else if (object.isUserDefinedObject) {
         var newIndent = '$indent  ';
         var typeStr = type.getDisplayString(withNullability: true);
diff --git a/pkg/analyzer/test/src/dart/resolution/enum_test.dart b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
index 43cf553..3381a96 100644
--- a/pkg/analyzer/test/src/dart/resolution/enum_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/test_utilities/find_element.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -232,6 +233,26 @@
     );
   }
 
+  test_getter() async {
+    await assertNoErrorsInCode(r'''
+enum E<T> {
+  v;
+  T get foo => throw 0;
+}
+''');
+
+    assertElement(
+      findNode.methodDeclaration('get foo'),
+      findElement.getter('foo', of: 'E'),
+    );
+
+    assertNamedType(
+      findNode.namedType('T get'),
+      findElement.typeParameter('T'),
+      'T',
+    );
+  }
+
   test_inference_listLiteral() async {
     await assertNoErrorsInCode(r'''
 enum E1 {a, b}
@@ -244,6 +265,21 @@
     assertType(v.type, 'List<Enum>');
   }
 
+  test_interfaces() async {
+    await assertNoErrorsInCode(r'''
+class I {}
+enum E implements I { // ref
+  v;
+}
+''');
+
+    assertNamedType(
+      findNode.namedType('I { // ref'),
+      findElement.class_('I'),
+      'I',
+    );
+  }
+
   test_isEnumConstant() async {
     await assertNoErrorsInCode(r'''
 enum E {
@@ -303,6 +339,68 @@
     );
   }
 
+  test_mixins() async {
+    await assertNoErrorsInCode(r'''
+mixin M {}
+enum E with M { // ref
+  v;
+}
+''');
+
+    assertNamedType(
+      findNode.namedType('M { // ref'),
+      findElement.mixin('M'),
+      'M',
+    );
+  }
+
+  test_mixins_inference() async {
+    await assertNoErrorsInCode(r'''
+mixin M1<T> {}
+mixin M2<T> on M1<T> {}
+enum E with M1<int>, M2 {
+  v;
+}
+''');
+
+    assertNamedType(
+      findNode.namedType('M1<int>'),
+      findElement.mixin('M1'),
+      'M1<int>',
+    );
+
+    assertNamedType(
+      findNode.namedType('M2 {'),
+      findElement.mixin('M2'),
+      'M2<int>',
+    );
+  }
+
+  test_setter() async {
+    await assertNoErrorsInCode(r'''
+enum E<T> {
+  v;
+  set foo(T a) {}
+}
+''');
+
+    assertElement(
+      findNode.methodDeclaration('set foo'),
+      findElement.setter('foo'),
+    );
+
+    assertElement(
+      findNode.simpleFormalParameter('a) {}'),
+      findElement.setter('foo').parameter('a'),
+    );
+
+    assertNamedType(
+      findNode.namedType('T a'),
+      findElement.typeParameter('T'),
+      'T',
+    );
+  }
+
   test_value_underscore() async {
     await assertNoErrorsInCode(r'''
 enum E { _ }
diff --git a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
index 2cd36d7..a053e01 100644
--- a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
@@ -559,6 +559,104 @@
     );
   }
 
+  test_value_genericClass_downwards_inference_namedConstructor() async {
+    await assertNoErrorsInCode(r'''
+class A<T> {
+  final List<List<T>> f;
+  const A.named(this.f);
+}
+
+@A.named([])
+void f() {}
+''');
+
+    var annotation = findNode.annotation('@A');
+    _assertResolvedNodeText(annotation, r'''
+Annotation
+  arguments: ArgumentList
+    arguments
+      ListLiteral
+        leftBracket: [
+        rightBracket: ]
+        staticType: List<List<Object?>>
+    leftParenthesis: (
+    rightParenthesis: )
+  atSign: @
+  element: ConstructorMember
+    base: self::@class::A::@constructor::named
+    substitution: {T: Object?}
+  name: PrefixedIdentifier
+    identifier: SimpleIdentifier
+      staticElement: ConstructorMember
+        base: self::@class::A::@constructor::named
+        substitution: {T: Object?}
+      staticType: null
+      token: named
+    period: .
+    prefix: SimpleIdentifier
+      staticElement: self::@class::A
+      staticType: null
+      token: A
+    staticElement: ConstructorMember
+      base: self::@class::A::@constructor::named
+      substitution: {T: Object?}
+    staticType: null
+''');
+    _assertAnnotationValueText(annotation, '''
+A<Object?>
+  f: List
+    elementType: List<Object?>
+''');
+    assertElement2(
+      findNode.listLiteral('[]').staticParameterElement,
+      declaration: findElement.fieldFormalParameter('f'),
+      substitution: {'T': 'Object?'},
+    );
+  }
+
+  test_value_genericClass_downwards_inference_unnamedConstructor() async {
+    await assertNoErrorsInCode(r'''
+ class A<T> {
+  final List<List<T>> f;
+  const A(this.f);
+}
+
+@A([])
+void f() {}
+''');
+
+    var annotation = findNode.annotation('@A');
+    _assertResolvedNodeText(annotation, r'''
+Annotation
+  arguments: ArgumentList
+    arguments
+      ListLiteral
+        leftBracket: [
+        rightBracket: ]
+        staticType: List<List<Object?>>
+    leftParenthesis: (
+    rightParenthesis: )
+  atSign: @
+  element: ConstructorMember
+    base: self::@class::A::@constructor::•
+    substitution: {T: Object?}
+  name: SimpleIdentifier
+    staticElement: self::@class::A
+    staticType: null
+    token: A
+''');
+    _assertAnnotationValueText(annotation, r'''
+A<Object?>
+  f: List
+    elementType: List<Object?>
+''');
+    assertElement2(
+      findNode.listLiteral('[]').staticParameterElement,
+      declaration: findElement.fieldFormalParameter('f'),
+      substitution: {'T': 'Object?'},
+    );
+  }
+
   test_value_genericClass_inference_namedConstructor() async {
     await assertNoErrorsInCode(r'''
 class A<T> {
diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
index fb6d6b1f..3187d2a 100644
--- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
@@ -2,7 +2,6 @@
 // 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.
 
-import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -190,743 +189,6 @@
     );
   }
 
-  test_error_builtInIdentifierAsTypeName() async {
-    await assertErrorsInCode(r'''
-mixin as {}
-''', [
-      error(CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME, 6, 2),
-    ]);
-  }
-
-  test_error_builtInIdentifierAsTypeName_OK_on() async {
-    await assertNoErrorsInCode(r'''
-class A {}
-
-mixin on on A {}
-
-mixin M on on {}
-
-mixin M2 implements on {}
-
-class B = A with on;
-class C = B with M;
-class D = Object with M2;
-''');
-  }
-
-  test_error_conflictingTypeVariableAndClass() async {
-    await assertErrorsInCode(r'''
-mixin M<M> {}
-''', [
-      error(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MIXIN, 8, 1),
-    ]);
-  }
-
-  test_error_conflictingTypeVariableAndMember_field() async {
-    await assertErrorsInCode(r'''
-mixin M<T> {
-  var T;
-}
-''', [
-      error(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_MIXIN, 8,
-          1),
-    ]);
-  }
-
-  test_error_conflictingTypeVariableAndMember_getter() async {
-    await assertErrorsInCode(r'''
-mixin M<T> {
-  get T => null;
-}
-''', [
-      error(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_MIXIN, 8,
-          1),
-    ]);
-  }
-
-  test_error_conflictingTypeVariableAndMember_method() async {
-    await assertErrorsInCode(r'''
-mixin M<T> {
-  T() {}
-}
-''', [
-      error(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_MIXIN, 8,
-          1),
-    ]);
-  }
-
-  test_error_conflictingTypeVariableAndMember_method_static() async {
-    await assertErrorsInCode(r'''
-mixin M<T> {
-  static T() {}
-}
-''', [
-      error(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_MIXIN, 8,
-          1),
-    ]);
-  }
-
-  test_error_conflictingTypeVariableAndMember_setter() async {
-    await assertErrorsInCode(r'''
-mixin M<T> {
-  void set T(_) {}
-}
-''', [
-      error(CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_MIXIN, 8,
-          1),
-    ]);
-  }
-
-  test_error_finalNotInitialized() async {
-    await assertErrorsInCode(r'''
-mixin M {
-  final int f;
-}
-''', [
-      error(CompileTimeErrorCode.FINAL_NOT_INITIALIZED, 22, 1),
-    ]);
-  }
-
-  test_error_finalNotInitialized_OK() async {
-    await assertNoErrorsInCode(r'''
-mixin M {
-  final int f = 0;
-}
-''');
-  }
-
-  test_error_implementsClause_deferredClass() async {
-    await assertErrorsInCode(r'''
-import 'dart:math' deferred as math;
-mixin M implements math.Random {}
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS, 56, 11),
-    ]);
-    var mathImport = findElement.import('dart:math');
-    var randomElement = mathImport.importedLibrary!.getType('Random')!;
-
-    var element = findElement.mixin('M');
-    assertElementTypes(element.interfaces, ['Random']);
-
-    var typeRef = findNode.namedType('Random {}');
-    assertNamedType(typeRef, randomElement, 'Random',
-        expectedPrefix: mathImport.prefix);
-  }
-
-  test_error_implementsClause_disallowedClass_int() async {
-    await assertErrorsInCode(r'''
-mixin M implements int {}
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 3),
-    ]);
-
-    var element = findElement.mixin('M');
-    assertElementTypes(element.interfaces, ['int']);
-
-    var typeRef = findNode.namedType('int {}');
-    assertNamedType(typeRef, intElement, 'int');
-  }
-
-  test_error_implementsClause_nonClass_void() async {
-    await assertErrorsInCode(r'''
-mixin M implements void {}
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, 19, 4),
-      error(ParserErrorCode.EXPECTED_TYPE_NAME, 19, 4),
-    ]);
-
-    var element = findElement.mixin('M');
-    assertElementTypes(element.interfaces, []);
-
-    var typeRef = findNode.namedType('void {}');
-    assertNamedType(typeRef, null, 'void');
-  }
-
-  test_error_memberWithClassName_getter() async {
-    await assertErrorsInCode(r'''
-mixin M {
-  int get M => 0;
-}
-''', [
-      error(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 20, 1),
-    ]);
-  }
-
-  test_error_memberWithClassName_getter_static() async {
-    await assertErrorsInCode(r'''
-mixin M {
-  static int get M => 0;
-}
-''', [
-      error(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 27, 1),
-    ]);
-  }
-
-  test_error_memberWithClassName_setter() async {
-    await assertErrorsInCode(r'''
-mixin M {
-  void set M(_) {}
-}
-''', [
-      error(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 21, 1),
-    ]);
-  }
-
-  test_error_memberWithClassName_setter_static() async {
-    await assertErrorsInCode(r'''
-mixin M {
-  static void set M(_) {}
-}
-''', [
-      error(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 28, 1),
-    ]);
-  }
-
-  test_error_mixinApplicationConcreteSuperInvokedMemberType_method() async {
-    await assertErrorsInCode(r'''
-class I {
-  void foo([int? p]) {}
-}
-
-class A {
-  void foo(int? p) {}
-}
-
-abstract class B extends A implements I {
-  void foo([int? p]);
-}
-
-mixin M on I {
-  void bar() {
-    super.foo(42);
-  }
-}
-
-abstract class X extends B with M {}
-''', [
-      error(
-          CompileTimeErrorCode
-              .MIXIN_APPLICATION_CONCRETE_SUPER_INVOKED_MEMBER_TYPE,
-          227,
-          1),
-    ]);
-  }
-
-  test_error_mixinApplicationConcreteSuperInvokedMemberType_OK_method_overriddenInMixin() async {
-    await assertNoErrorsInCode(r'''
-class A<T> {
-  void remove(T x) {}
-}
-
-mixin M<U> on A<U> {
-  void remove(Object? x) {
-    super.remove(x as U);
-  }
-}
-
-class X<T> = A<T> with M<T>;
-''');
-  }
-
-  test_error_mixinApplicationNoConcreteSuperInvokedMember_getter() async {
-    await assertErrorsInCode(r'''
-abstract class A {
-  int get foo;
-}
-
-mixin M on A {
-  void bar() {
-    super.foo;
-  }
-}
-
-abstract class X extends A with M {}
-''', [
-      error(
-          CompileTimeErrorCode
-              .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
-          121,
-          1),
-    ]);
-  }
-
-  test_error_mixinApplicationNoConcreteSuperInvokedMember_inNextMixin() async {
-    await assertErrorsInCode('''
-abstract class A {
-  void foo();
-}
-
-mixin M1 on A {
-  void foo() {
-    super.foo();
-  }
-}
-
-mixin M2 on A {
-  void foo() {}
-}
-
-class X extends A with M1, M2 {}
-''', [
-      error(
-          CompileTimeErrorCode
-              .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
-          149,
-          2),
-    ]);
-  }
-
-  test_error_mixinApplicationNoConcreteSuperInvokedMember_inSameMixin() async {
-    await assertErrorsInCode('''
-abstract class A {
-  void foo();
-}
-
-mixin M on A {
-  void foo() {
-    super.foo();
-  }
-}
-
-class X extends A with M {}
-''', [
-      error(
-          CompileTimeErrorCode
-              .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
-          113,
-          1),
-    ]);
-  }
-
-  test_error_mixinApplicationNoConcreteSuperInvokedMember_method() async {
-    await assertErrorsInCode(r'''
-abstract class A {
-  void foo();
-}
-
-mixin M on A {
-  void bar() {
-    super.foo();
-  }
-}
-
-abstract class X extends A with M {}
-''', [
-      error(
-          CompileTimeErrorCode
-              .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
-          122,
-          1),
-    ]);
-  }
-
-  test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_hasNSM() async {
-    await assertNoErrorsInCode(r'''
-abstract class A {
-  void foo();
-}
-
-mixin M on A {
-  void bar() {
-    super.foo();
-  }
-}
-
-class C implements A {
-  noSuchMethod(_) {}
-}
-
-class X extends C with M {}
-''');
-  }
-
-  test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_hasNSM2() async {
-    await assertNoErrorsInCode(r'''
-abstract class A {
-  void foo();
-}
-
-mixin M on A {
-  void bar() {
-    super.foo();
-  }
-}
-
-/// Class `B` has noSuchMethod forwarder for `foo`.
-class B implements A {
-  noSuchMethod(_) {}
-}
-
-/// Class `C` is abstract, but it inherits noSuchMethod forwarders from `B`.
-abstract class C extends B {}
-
-class X extends C with M {}
-''');
-  }
-
-  test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_inPreviousMixin() async {
-    await assertNoErrorsInCode(r'''
-abstract class A {
-  void foo();
-}
-
-mixin M1 {
-  void foo() {}
-}
-
-mixin M2 on A {
-  void bar() {
-    super.foo();
-  }
-}
-
-class X extends A with M1, M2 {}
-''');
-  }
-
-  test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_inSuper_fromMixin() async {
-    await assertNoErrorsInCode(r'''
-abstract class A {
-  void foo();
-}
-
-mixin M1 {
-  void foo() {}
-}
-
-class B extends A with M1 {}
-
-mixin M2 on A {
-  void bar() {
-    super.foo();
-  }
-}
-
-class X extends B with M2 {}
-''');
-  }
-
-  test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_notInvoked() async {
-    await assertNoErrorsInCode(r'''
-abstract class A {
-  void foo();
-}
-
-mixin M on A {}
-
-abstract class X extends A with M {}
-''');
-  }
-
-  test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_super_covariant() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  bar(num n) {}
-}
-
-mixin M on A {
-  test() {
-    super.bar(3.14);
-  }
-}
-
-class B implements A {
-  bar(covariant int i) {}
-}
-
-class C extends B with M {}
-''');
-  }
-
-  test_error_mixinApplicationNoConcreteSuperInvokedMember_setter() async {
-    await assertErrorsInCode(r'''
-abstract class A {
-  void set foo(_);
-}
-
-mixin M on A {
-  void bar() {
-    super.foo = 0;
-  }
-}
-
-abstract class X extends A with M {}
-''', [
-      error(
-          CompileTimeErrorCode
-              .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
-          129,
-          1),
-    ]);
-  }
-
-  test_error_mixinApplicationNotImplementedInterface() async {
-    await assertErrorsInCode(r'''
-class A {}
-
-mixin M on A {}
-
-class X = Object with M;
-''', [
-      error(CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
-          51, 1),
-    ]);
-  }
-
-  test_error_mixinApplicationNotImplementedInterface_generic() async {
-    await assertErrorsInCode(r'''
-class A<T> {}
-
-mixin M on A<int> {}
-
-class X = A<double> with M;
-''', [
-      error(CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
-          62, 1),
-    ]);
-  }
-
-  test_error_mixinApplicationNotImplementedInterface_noMemberErrors() async {
-    await assertErrorsInCode(r'''
-class A {
-  void foo() {}
-}
-
-mixin M on A {
-  void bar() {
-    super.foo();
-  }
-}
-
-class C {
-  noSuchMethod(_) {}
-}
-
-class X = C with M;
-''', [
-      error(CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
-          134, 1),
-    ]);
-  }
-
-  test_error_mixinApplicationNotImplementedInterface_OK_0() async {
-    await assertNoErrorsInCode(r'''
-mixin M {}
-
-class X = Object with M;
-''');
-  }
-
-  test_error_mixinApplicationNotImplementedInterface_OK_1() async {
-    await assertNoErrorsInCode(r'''
-class A {}
-
-mixin M on A {}
-
-class X = A with M;
-''');
-  }
-
-  test_error_mixinApplicationNotImplementedInterface_OK_generic() async {
-    await assertNoErrorsInCode(r'''
-class A<T> {}
-
-mixin M<T> on A<T> {}
-
-class B<T> implements A<T> {}
-
-class C<T> = B<T> with M<T>;
-''');
-  }
-
-  test_error_mixinApplicationNotImplementedInterface_OK_previousMixin() async {
-    await assertNoErrorsInCode(r'''
-class A {}
-
-mixin M1 implements A {}
-
-mixin M2 on A {}
-
-class X = Object with M1, M2;
-''');
-  }
-
-  test_error_mixinApplicationNotImplementedInterface_oneOfTwo() async {
-    await assertErrorsInCode(r'''
-class A {}
-class B {}
-class C {}
-
-mixin M on A, B {}
-
-class X = C with M;
-''', [
-      error(CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
-          71, 1),
-    ]);
-  }
-
-  test_error_mixinInstantiate_default() async {
-    await assertErrorsInCode(r'''
-mixin M {}
-
-main() {
-  new M();
-}
-''', [
-      error(CompileTimeErrorCode.MIXIN_INSTANTIATE, 27, 1),
-    ]);
-
-    var creation = findNode.instanceCreation('M();');
-    var m = findElement.mixin('M');
-    assertInstanceCreation(creation, m, 'M');
-  }
-
-  test_error_mixinInstantiate_named() async {
-    await assertErrorsInCode(r'''
-mixin M {
-  M.named() {}
-}
-
-main() {
-  new M.named();
-}
-''', [
-      error(ParserErrorCode.MIXIN_DECLARES_CONSTRUCTOR, 12, 1),
-      error(CompileTimeErrorCode.MIXIN_INSTANTIATE, 43, 1),
-    ]);
-
-    var creation = findNode.instanceCreation('M.named();');
-    var m = findElement.mixin('M');
-    assertInstanceCreation(creation, m, 'M', constructorName: 'named');
-  }
-
-  test_error_mixinInstantiate_undefined() async {
-    await assertErrorsInCode(r'''
-mixin M {}
-
-main() {
-  new M.named();
-}
-''', [
-      error(CompileTimeErrorCode.MIXIN_INSTANTIATE, 27, 1),
-    ]);
-
-    var creation = findNode.instanceCreation('M.named();');
-    var m = findElement.mixin('M');
-    assertElement(creation.constructorName.type2.name, m);
-  }
-
-  test_error_onClause_deferredClass() async {
-    await assertErrorsInCode(r'''
-import 'dart:math' deferred as math;
-mixin M on math.Random {}
-''', [
-      error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_DEFERRED_CLASS,
-          48, 11),
-    ]);
-    var mathImport = findElement.import('dart:math');
-    var randomElement = mathImport.importedLibrary!.getType('Random')!;
-
-    var element = findElement.mixin('M');
-    assertElementTypes(element.superclassConstraints, ['Random']);
-
-    var typeRef = findNode.namedType('Random {}');
-    assertNamedType(typeRef, randomElement, 'Random',
-        expectedPrefix: mathImport.prefix);
-  }
-
-  test_error_onClause_disallowedClass_int() async {
-    await assertErrorsInCode(r'''
-mixin M on int {}
-''', [
-      error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_DISALLOWED_CLASS,
-          11, 3),
-    ]);
-
-    var element = findElement.mixin('M');
-    assertElementTypes(element.superclassConstraints, ['int']);
-
-    var typeRef = findNode.namedType('int {}');
-    assertNamedType(typeRef, intElement, 'int');
-  }
-
-  test_error_onClause_nonInterface_dynamic() async {
-    await assertErrorsInCode(r'''
-mixin M on dynamic {}
-''', [
-      error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_NON_INTERFACE, 11,
-          7),
-    ]);
-
-    var element = findElement.mixin('M');
-    assertElementTypes(element.superclassConstraints, ['Object']);
-
-    var typeRef = findNode.namedType('dynamic {}');
-    assertNamedType(typeRef, dynamicElement, 'dynamic');
-  }
-
-  test_error_onClause_nonInterface_enum() async {
-    await assertErrorsInCode(r'''
-enum E {E1, E2, E3}
-mixin M on E {}
-''', [
-      error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_NON_INTERFACE, 31,
-          1),
-    ]);
-
-    var element = findElement.mixin('M');
-    assertElementTypes(element.superclassConstraints, ['Object']);
-
-    var typeRef = findNode.namedType('E {}');
-    assertNamedType(typeRef, findElement.enum_('E'), 'E');
-  }
-
-  test_error_onClause_nonInterface_void() async {
-    await assertErrorsInCode(r'''
-mixin M on void {}
-''', [
-      error(ParserErrorCode.EXPECTED_TYPE_NAME, 11, 4),
-      error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_NON_INTERFACE, 11,
-          4),
-    ]);
-
-    var element = findElement.mixin('M');
-    assertElementTypes(element.superclassConstraints, ['Object']);
-
-    var typeRef = findNode.namedType('void {}');
-    assertNamedType(typeRef, null, 'void');
-  }
-
-  test_error_onClause_OK_mixin() async {
-    await assertNoErrorsInCode(r'''
-mixin A {}
-mixin B on A {} // ref
-''');
-
-    var b = findElement.mixin('B');
-    assertElementTypes(b.superclassConstraints, ['A']);
-  }
-
-  test_error_undefinedSuperMethod() async {
-    await assertErrorsInCode(r'''
-class A {}
-
-mixin M on A {
-  void bar() {
-    super.foo(42);
-  }
-}
-''', [
-      error(CompileTimeErrorCode.UNDEFINED_SUPER_METHOD, 52, 3),
-    ]);
-
-    var invocation = findNode.methodInvocation('foo(42)');
-    assertElementNull(invocation.methodName);
-    assertInvokeTypeDynamic(invocation);
-    assertTypeDynamic(invocation);
-  }
-
   test_field() async {
     await assertNoErrorsInCode(r'''
 mixin M<T> {
diff --git a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
index 226eafa..f8b4487 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
@@ -219,6 +219,17 @@
     ]);
   }
 
+  test_annotation_type_arguments_inferred() async {
+    await assertNoErrorsInCode('''
+@C([])
+int i = 0;
+
+class C<T> {
+  const C(List<List<T>> arg);
+}
+''');
+  }
+
   test_annotation_unnamedConstructor() async {
     await assertErrorsInCode('''
 class A {
diff --git a/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_type_name_test.dart b/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_type_name_test.dart
index 2923bf7..2a7e27d 100644
--- a/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_type_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/built_in_identifier_as_type_name_test.dart
@@ -30,4 +30,20 @@
       error(CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME, 6, 2),
     ]);
   }
+
+  test_mixin_OK_on() async {
+    await assertNoErrorsInCode(r'''
+class A {}
+
+mixin on on A {}
+
+mixin M on on {}
+
+mixin M2 implements on {}
+
+class B = A with on;
+class C = B with M;
+class D = Object with M2;
+''');
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart b/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
index 270c1bd..e4fb280 100644
--- a/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
@@ -80,6 +80,14 @@
       error(CompileTimeErrorCode.FINAL_NOT_INITIALIZED, 22, 1),
     ]);
   }
+
+  test_mixin_OK() async {
+    await assertNoErrorsInCode(r'''
+mixin M {
+  final int f = 0;
+}
+''');
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analyzer/test/src/diagnostics/implements_deferred_class_test.dart b/pkg/analyzer/test/src/diagnostics/implements_deferred_class_test.dart
index 56e199e..bfa2a8d 100644
--- a/pkg/analyzer/test/src/diagnostics/implements_deferred_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/implements_deferred_class_test.dart
@@ -15,7 +15,7 @@
 
 @reflectiveTest
 class ImplementsDeferredClassTest extends PubPackageResolutionTest {
-  test_implements() async {
+  test_class_implements() async {
     newFile('$testPackageLibPath/lib1.dart', content: '''
 library lib1;
 class A {}
@@ -29,7 +29,7 @@
     ]);
   }
 
-  test_implements_interfaceTypeTypedef() async {
+  test_class_implements_interfaceTypeTypedef() async {
     newFile('$testPackageLibPath/lib1.dart', content: '''
 library lib1;
 class A {}
@@ -44,7 +44,7 @@
     ]);
   }
 
-  test_mixinApplication() async {
+  test_classTypeAlias() async {
     newFile('$testPackageLibPath/lib1.dart', content: '''
 library lib1;
 class A {}
@@ -59,4 +59,22 @@
       error(CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS, 100, 3),
     ]);
   }
+
+  test_mixin() async {
+    await assertErrorsInCode(r'''
+import 'dart:math' deferred as math;
+mixin M implements math.Random {}
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS, 56, 11),
+    ]);
+    var mathImport = findElement.import('dart:math');
+    var randomElement = mathImport.importedLibrary!.getType('Random')!;
+
+    var element = findElement.mixin('M');
+    assertElementTypes(element.interfaces, ['Random']);
+
+    var typeRef = findNode.namedType('Random {}');
+    assertNamedType(typeRef, randomElement, 'Random',
+        expectedPrefix: mathImport.prefix);
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/implements_disallowed_class_test.dart b/pkg/analyzer/test/src/diagnostics/implements_disallowed_class_test.dart
index 64e25bc..84629e0 100644
--- a/pkg/analyzer/test/src/diagnostics/implements_disallowed_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/implements_disallowed_class_test.dart
@@ -180,4 +180,18 @@
       error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 60, 3),
     ]);
   }
+
+  test_mixin_int() async {
+    await assertErrorsInCode(r'''
+mixin M implements int {}
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS, 19, 3),
+    ]);
+
+    var element = findElement.mixin('M');
+    assertElementTypes(element.interfaces, ['int']);
+
+    var typeRef = findNode.namedType('int {}');
+    assertNamedType(typeRef, intElement, 'int');
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/implements_non_class_test.dart b/pkg/analyzer/test/src/diagnostics/implements_non_class_test.dart
index 01890bb..8ce99b4 100644
--- a/pkg/analyzer/test/src/diagnostics/implements_non_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/implements_non_class_test.dart
@@ -17,6 +17,17 @@
 @reflectiveTest
 class ImplementsNonClassTest extends PubPackageResolutionTest
     with ImplementsNonClassTestCases {
+  test_inEnum_topLevelVariable() async {
+    await assertErrorsInCode(r'''
+int A = 7;
+enum E implements A {
+  v
+}
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, 29, 1),
+    ]);
+  }
+
   test_Never() async {
     await assertErrorsInCode('''
 class A implements Never {}
@@ -27,16 +38,7 @@
 }
 
 mixin ImplementsNonClassTestCases on PubPackageResolutionTest {
-  test_class() async {
-    await assertErrorsInCode(r'''
-int A = 7;
-class B implements A {}
-''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, 30, 1),
-    ]);
-  }
-
-  test_dynamic() async {
+  test_inClass_dynamic() async {
     await assertErrorsInCode('''
 class A implements dynamic {}
 ''', [
@@ -44,7 +46,7 @@
     ]);
   }
 
-  test_enum() async {
+  test_inClass_enum() async {
     await assertErrorsInCode(r'''
 enum E { ONE }
 class A implements E {}
@@ -53,7 +55,16 @@
     ]);
   }
 
-  test_typeAlias() async {
+  test_inClass_topLevelVariable() async {
+    await assertErrorsInCode(r'''
+int A = 7;
+class B implements A {}
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, 30, 1),
+    ]);
+  }
+
+  test_inClassTypeAlias() async {
     await assertErrorsInCode(r'''
 class A {}
 class M {}
@@ -63,6 +74,14 @@
       error(CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, 63, 1),
     ]);
   }
+
+  test_inMixin_dynamic() async {
+    await assertErrorsInCode(r'''
+mixin M implements dynamic {}
+''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, 19, 7),
+    ]);
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
index 726f456..fb7e87c 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
@@ -74,6 +74,19 @@
     ]);
   }
 
+  test_invalid_interfaceType_enum_interfaces() async {
+    await assertErrorsInCode('''
+class I {}
+class J {}
+enum E implements J {
+  v
+}
+I x = E.v;
+''', [
+      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 56, 3),
+    ]);
+  }
+
   test_invalid_noCall_functionContext() async {
     await assertErrorsInCode('''
 class C {}
@@ -261,6 +274,16 @@
 ''');
   }
 
+  test_valid_interfaceType_enum_interfaces() async {
+    await assertNoErrorsInCode('''
+class I {}
+enum E implements I {
+  v
+}
+I x = E.v;
+''');
+  }
+
   test_valid_nonGenericCall() async {
     await assertNoErrorsInCode('''
 class C {
diff --git a/pkg/analyzer/test/src/diagnostics/member_with_class_name_test.dart b/pkg/analyzer/test/src/diagnostics/member_with_class_name_test.dart
index abe984c..d9583c5 100644
--- a/pkg/analyzer/test/src/diagnostics/member_with_class_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/member_with_class_name_test.dart
@@ -15,7 +15,7 @@
 
 @reflectiveTest
 class MemberWithClassNameTest extends PubPackageResolutionTest {
-  test_field() async {
+  test_class_field() async {
     await assertErrorsInCode(r'''
 class A {
   int A = 0;
@@ -25,7 +25,7 @@
     ]);
   }
 
-  test_field_multiple() async {
+  test_class_field_multiple() async {
     await assertErrorsInCode(r'''
 class A {
   int z = 0, A = 0, b = 0;
@@ -35,7 +35,7 @@
     ]);
   }
 
-  test_getter() async {
+  test_class_getter() async {
     await assertErrorsInCode(r'''
 class A {
   get A => 0;
@@ -45,8 +45,48 @@
     ]);
   }
 
-  test_method() async {
+  test_class_method() async {
     // No test because a method named the same as the enclosing class is
     // indistinguishable from a constructor.
   }
+
+  test_mixin_getter() async {
+    await assertErrorsInCode(r'''
+mixin M {
+  int get M => 0;
+}
+''', [
+      error(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 20, 1),
+    ]);
+  }
+
+  test_mixin_getter_static() async {
+    await assertErrorsInCode(r'''
+mixin M {
+  static int get M => 0;
+}
+''', [
+      error(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 27, 1),
+    ]);
+  }
+
+  test_mixin_setter() async {
+    await assertErrorsInCode(r'''
+mixin M {
+  void set M(_) {}
+}
+''', [
+      error(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 21, 1),
+    ]);
+  }
+
+  test_mixin_setter_static() async {
+    await assertErrorsInCode(r'''
+mixin M {
+  static void set M(_) {}
+}
+''', [
+      error(ParserErrorCode.MEMBER_WITH_CLASS_NAME, 28, 1),
+    ]);
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_application_concrete_super_invoked_member_type_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_application_concrete_super_invoked_member_type_test.dart
new file mode 100644
index 0000000..37dd4c5
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/mixin_application_concrete_super_invoked_member_type_test.dart
@@ -0,0 +1,64 @@
+// 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.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MixinApplicationConcreteSuperInvokedMemberTypeTest);
+  });
+}
+
+@reflectiveTest
+class MixinApplicationConcreteSuperInvokedMemberTypeTest
+    extends PubPackageResolutionTest {
+  test_method() async {
+    await assertErrorsInCode(r'''
+class I {
+  void foo([int? p]) {}
+}
+
+class A {
+  void foo(int? p) {}
+}
+
+abstract class B extends A implements I {
+  void foo([int? p]);
+}
+
+mixin M on I {
+  void bar() {
+    super.foo(42);
+  }
+}
+
+abstract class X extends B with M {}
+''', [
+      error(
+          CompileTimeErrorCode
+              .MIXIN_APPLICATION_CONCRETE_SUPER_INVOKED_MEMBER_TYPE,
+          227,
+          1),
+    ]);
+  }
+
+  test_method_OK_overriddenInMixin() async {
+    await assertNoErrorsInCode(r'''
+class A<T> {
+  void remove(T x) {}
+}
+
+mixin M<U> on A<U> {
+  void remove(Object? x) {
+    super.remove(x as U);
+  }
+}
+
+class X<T> = A<T> with M<T>;
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_application_no_concrete_super_invoked_member_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_application_no_concrete_super_invoked_member_test.dart
new file mode 100644
index 0000000..71d5ed5
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/mixin_application_no_concrete_super_invoked_member_test.dart
@@ -0,0 +1,250 @@
+// 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.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MixinApplicationNoConcreteSuperInvokedMemberTest);
+  });
+}
+
+@reflectiveTest
+class MixinApplicationNoConcreteSuperInvokedMemberTest
+    extends PubPackageResolutionTest {
+  test_getter() async {
+    await assertErrorsInCode(r'''
+abstract class A {
+  int get foo;
+}
+
+mixin M on A {
+  void bar() {
+    super.foo;
+  }
+}
+
+abstract class X extends A with M {}
+''', [
+      error(
+          CompileTimeErrorCode
+              .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
+          121,
+          1),
+    ]);
+  }
+
+  test_inNextMixin() async {
+    await assertErrorsInCode('''
+abstract class A {
+  void foo();
+}
+
+mixin M1 on A {
+  void foo() {
+    super.foo();
+  }
+}
+
+mixin M2 on A {
+  void foo() {}
+}
+
+class X extends A with M1, M2 {}
+''', [
+      error(
+          CompileTimeErrorCode
+              .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
+          149,
+          2),
+    ]);
+  }
+
+  test_inSameMixin() async {
+    await assertErrorsInCode('''
+abstract class A {
+  void foo();
+}
+
+mixin M on A {
+  void foo() {
+    super.foo();
+  }
+}
+
+class X extends A with M {}
+''', [
+      error(
+          CompileTimeErrorCode
+              .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
+          113,
+          1),
+    ]);
+  }
+
+  test_method() async {
+    await assertErrorsInCode(r'''
+abstract class A {
+  void foo();
+}
+
+mixin M on A {
+  void bar() {
+    super.foo();
+  }
+}
+
+abstract class X extends A with M {}
+''', [
+      error(
+          CompileTimeErrorCode
+              .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
+          122,
+          1),
+    ]);
+  }
+
+  test_OK_hasNSM() async {
+    await assertNoErrorsInCode(r'''
+abstract class A {
+  void foo();
+}
+
+mixin M on A {
+  void bar() {
+    super.foo();
+  }
+}
+
+class C implements A {
+  noSuchMethod(_) {}
+}
+
+class X extends C with M {}
+''');
+  }
+
+  test_OK_hasNSM2() async {
+    await assertNoErrorsInCode(r'''
+abstract class A {
+  void foo();
+}
+
+mixin M on A {
+  void bar() {
+    super.foo();
+  }
+}
+
+/// Class `B` has noSuchMethod forwarder for `foo`.
+class B implements A {
+  noSuchMethod(_) {}
+}
+
+/// Class `C` is abstract, but it inherits noSuchMethod forwarders from `B`.
+abstract class C extends B {}
+
+class X extends C with M {}
+''');
+  }
+
+  test_OK_inPreviousMixin() async {
+    await assertNoErrorsInCode(r'''
+abstract class A {
+  void foo();
+}
+
+mixin M1 {
+  void foo() {}
+}
+
+mixin M2 on A {
+  void bar() {
+    super.foo();
+  }
+}
+
+class X extends A with M1, M2 {}
+''');
+  }
+
+  test_OK_inSuper_fromMixin() async {
+    await assertNoErrorsInCode(r'''
+abstract class A {
+  void foo();
+}
+
+mixin M1 {
+  void foo() {}
+}
+
+class B extends A with M1 {}
+
+mixin M2 on A {
+  void bar() {
+    super.foo();
+  }
+}
+
+class X extends B with M2 {}
+''');
+  }
+
+  test_OK_notInvoked() async {
+    await assertNoErrorsInCode(r'''
+abstract class A {
+  void foo();
+}
+
+mixin M on A {}
+
+abstract class X extends A with M {}
+''');
+  }
+
+  test_OK_super_covariant() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  bar(num n) {}
+}
+
+mixin M on A {
+  test() {
+    super.bar(3.14);
+  }
+}
+
+class B implements A {
+  bar(covariant int i) {}
+}
+
+class C extends B with M {}
+''');
+  }
+
+  test_setter() async {
+    await assertErrorsInCode(r'''
+abstract class A {
+  void set foo(_);
+}
+
+mixin M on A {
+  void bar() {
+    super.foo = 0;
+  }
+}
+
+abstract class X extends A with M {}
+''', [
+      error(
+          CompileTimeErrorCode
+              .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
+          129,
+          1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_application_not_implemented_interface_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_application_not_implemented_interface_test.dart
index 0266782..9354651a 100644
--- a/pkg/analyzer/test/src/diagnostics/mixin_application_not_implemented_interface_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/mixin_application_not_implemented_interface_test.dart
@@ -16,6 +16,19 @@
 @reflectiveTest
 class MixinApplicationNotImplementedInterfaceTest
     extends PubPackageResolutionTest {
+  test_generic() async {
+    await assertErrorsInCode(r'''
+class A<T> {}
+
+mixin M on A<int> {}
+
+class X = A<double> with M;
+''', [
+      error(CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
+          62, 1),
+    ]);
+  }
+
   test_matchingClass_inPreviousMixin_new_syntax() async {
     await assertNoErrorsInCode('''
 abstract class A<T> {}
@@ -80,6 +93,99 @@
     ]);
   }
 
+  test_noMemberErrors() async {
+    await assertErrorsInCode(r'''
+class A {
+  void foo() {}
+}
+
+mixin M on A {
+  void bar() {
+    super.foo();
+  }
+}
+
+class C {
+  noSuchMethod(_) {}
+}
+
+class X = C with M;
+''', [
+      error(CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
+          134, 1),
+    ]);
+  }
+
+  test_notGeneric() async {
+    await assertErrorsInCode(r'''
+class A {}
+
+mixin M on A {}
+
+class X = Object with M;
+''', [
+      error(CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
+          51, 1),
+    ]);
+  }
+
+  test_OK_0() async {
+    await assertNoErrorsInCode(r'''
+mixin M {}
+
+class X = Object with M;
+''');
+  }
+
+  test_OK_1() async {
+    await assertNoErrorsInCode(r'''
+class A {}
+
+mixin M on A {}
+
+class X = A with M;
+''');
+  }
+
+  test_OK_generic() async {
+    await assertNoErrorsInCode(r'''
+class A<T> {}
+
+mixin M<T> on A<T> {}
+
+class B<T> implements A<T> {}
+
+class C<T> = B<T> with M<T>;
+''');
+  }
+
+  test_OK_previousMixin() async {
+    await assertNoErrorsInCode(r'''
+class A {}
+
+mixin M1 implements A {}
+
+mixin M2 on A {}
+
+class X = Object with M1, M2;
+''');
+  }
+
+  test_oneOfTwo() async {
+    await assertErrorsInCode(r'''
+class A {}
+class B {}
+class C {}
+
+mixin M on A, B {}
+
+class X = C with M;
+''', [
+      error(CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
+          71, 1),
+    ]);
+  }
+
   test_recursiveSubtypeCheck_new_syntax() async {
     // See dartbug.com/32353 for a detailed explanation.
     await assertErrorsInCode('''
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_instantiate_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_instantiate_test.dart
new file mode 100644
index 0000000..ff289367
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/mixin_instantiate_test.dart
@@ -0,0 +1,69 @@
+// 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.
+
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MixinInstantiateTest);
+  });
+}
+
+@reflectiveTest
+class MixinInstantiateTest extends PubPackageResolutionTest {
+  test_namedConstructor() async {
+    await assertErrorsInCode(r'''
+mixin M {
+  M.named() {}
+}
+
+main() {
+  new M.named();
+}
+''', [
+      error(ParserErrorCode.MIXIN_DECLARES_CONSTRUCTOR, 12, 1),
+      error(CompileTimeErrorCode.MIXIN_INSTANTIATE, 43, 1),
+    ]);
+
+    var creation = findNode.instanceCreation('M.named();');
+    var m = findElement.mixin('M');
+    assertInstanceCreation(creation, m, 'M', constructorName: 'named');
+  }
+
+  test_namedConstructor_undefined() async {
+    await assertErrorsInCode(r'''
+mixin M {}
+
+main() {
+  new M.named();
+}
+''', [
+      error(CompileTimeErrorCode.MIXIN_INSTANTIATE, 27, 1),
+    ]);
+
+    var creation = findNode.instanceCreation('M.named();');
+    var m = findElement.mixin('M');
+    assertElement(creation.constructorName.type2.name, m);
+  }
+
+  test_unnamedConstructor() async {
+    await assertErrorsInCode(r'''
+mixin M {}
+
+main() {
+  new M();
+}
+''', [
+      error(CompileTimeErrorCode.MIXIN_INSTANTIATE, 27, 1),
+    ]);
+
+    var creation = findNode.instanceCreation('M();');
+    var m = findElement.mixin('M');
+    assertInstanceCreation(creation, m, 'M');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_of_non_class_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_of_non_class_test.dart
index 47c9fd2..beb970a 100644
--- a/pkg/analyzer/test/src/diagnostics/mixin_of_non_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/mixin_of_non_class_test.dart
@@ -17,6 +17,36 @@
 @reflectiveTest
 class MixinOfNonClassTest extends PubPackageResolutionTest
     with MixinOfNonClassTestCases {
+  test_enum_enum() async {
+    await assertErrorsInCode(r'''
+enum E1 { v }
+enum E2 with E1 { v }
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 27, 2),
+    ]);
+  }
+
+  test_enum_topLevelVariable() async {
+    await assertErrorsInCode(r'''
+int A = 7;
+enum E with A {
+  v
+}
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 23, 1),
+    ]);
+  }
+
+  test_enum_undefined() async {
+    await assertErrorsInCode(r'''
+enum E with M {
+  v
+}
+''', [
+      error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 12, 1),
+    ]);
+  }
+
   test_Never() async {
     await assertErrorsInCode('''
 class A with Never {}
@@ -27,16 +57,7 @@
 }
 
 mixin MixinOfNonClassTestCases on PubPackageResolutionTest {
-  test_class() async {
-    await assertErrorsInCode(r'''
-int A = 7;
-class B extends Object with A {}
-''', [
-      error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 39, 1),
-    ]);
-  }
-
-  test_enum() async {
+  test_class_enum() async {
     await assertErrorsInCode(r'''
 enum E { ONE }
 class A extends Object with E {}
@@ -45,19 +66,16 @@
     ]);
   }
 
-  @failingTest
-  test_non_class() async {
-    // TODO(brianwilkerson) Compare with MIXIN_WITH_NON_CLASS_SUPERCLASS.
-    // TODO(brianwilkerson) Fix the offset and length.
+  test_class_topLevelVariable() async {
     await assertErrorsInCode(r'''
-var A;
-class B extends Object mixin A {}
+int A = 7;
+class B extends Object with A {}
 ''', [
-      error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 0, 0),
+      error(CompileTimeErrorCode.MIXIN_OF_NON_CLASS, 39, 1),
     ]);
   }
 
-  test_typeAlias() async {
+  test_class_typeAlias() async {
     await assertErrorsInCode(r'''
 class A {}
 int B = 7;
@@ -67,7 +85,7 @@
     ]);
   }
 
-  test_undefined() async {
+  test_class_undefined() async {
     await assertErrorsInCode(r'''
 class C with M {}
 ''', [
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_deferred_class_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_deferred_class_test.dart
new file mode 100644
index 0000000..4985163
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_deferred_class_test.dart
@@ -0,0 +1,37 @@
+// 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.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MixinSuperClassConstraintDeferredClassTest);
+  });
+}
+
+@reflectiveTest
+class MixinSuperClassConstraintDeferredClassTest
+    extends PubPackageResolutionTest {
+  test_error_onClause_deferredClass() async {
+    await assertErrorsInCode(r'''
+import 'dart:math' deferred as math;
+mixin M on math.Random {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_DEFERRED_CLASS,
+          48, 11),
+    ]);
+    var mathImport = findElement.import('dart:math');
+    var randomElement = mathImport.importedLibrary!.getType('Random')!;
+
+    var element = findElement.mixin('M');
+    assertElementTypes(element.superclassConstraints, ['Random']);
+
+    var typeRef = findNode.namedType('Random {}');
+    assertNamedType(typeRef, randomElement, 'Random',
+        expectedPrefix: mathImport.prefix);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_disallowed_class_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_disallowed_class_test.dart
new file mode 100644
index 0000000..f52ca1e
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_disallowed_class_test.dart
@@ -0,0 +1,33 @@
+// 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.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MixinSuperClassConstraintDisallowedClassTest);
+  });
+}
+
+@reflectiveTest
+class MixinSuperClassConstraintDisallowedClassTest
+    extends PubPackageResolutionTest {
+  test_int() async {
+    await assertErrorsInCode(r'''
+mixin M on int {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_DISALLOWED_CLASS,
+          11, 3),
+    ]);
+
+    var element = findElement.mixin('M');
+    assertElementTypes(element.superclassConstraints, ['int']);
+
+    var typeRef = findNode.namedType('int {}');
+    assertNamedType(typeRef, intElement, 'int');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_non_interface_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_non_interface_test.dart
index 08db55e..282e9eb 100644
--- a/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_non_interface_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/mixin_super_class_constraint_non_interface_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -16,6 +17,37 @@
 @reflectiveTest
 class MixinSuperClassConstraintNonInterfaceTest
     extends PubPackageResolutionTest {
+  test_dynamic() async {
+    await assertErrorsInCode(r'''
+mixin M on dynamic {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_NON_INTERFACE, 11,
+          7),
+    ]);
+
+    var element = findElement.mixin('M');
+    assertElementTypes(element.superclassConstraints, ['Object']);
+
+    var typeRef = findNode.namedType('dynamic {}');
+    assertNamedType(typeRef, dynamicElement, 'dynamic');
+  }
+
+  test_enum() async {
+    await assertErrorsInCode(r'''
+enum E { v }
+mixin M on E {}
+''', [
+      error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_NON_INTERFACE, 24,
+          1),
+    ]);
+
+    var element = findElement.mixin('M');
+    assertElementTypes(element.superclassConstraints, ['Object']);
+
+    var typeRef = findNode.namedType('E {}');
+    assertNamedType(typeRef, findElement.enum_('E'), 'E');
+  }
+
   test_Never() async {
     await assertErrorsInCode('''
 mixin M on Never {}
@@ -24,4 +56,20 @@
           5),
     ]);
   }
+
+  test_void() async {
+    await assertErrorsInCode(r'''
+mixin M on void {}
+''', [
+      error(ParserErrorCode.EXPECTED_TYPE_NAME, 11, 4),
+      error(CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_NON_INTERFACE, 11,
+          4),
+    ]);
+
+    var element = findElement.mixin('M');
+    assertElementTypes(element.superclassConstraints, ['Object']);
+
+    var typeRef = findNode.namedType('void {}');
+    assertNamedType(typeRef, null, 'void');
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/static_access_to_instance_member_test.dart b/pkg/analyzer/test/src/diagnostics/static_access_to_instance_member_test.dart
index 3ae9041..8c13030 100644
--- a/pkg/analyzer/test/src/diagnostics/static_access_to_instance_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/static_access_to_instance_member_test.dart
@@ -101,6 +101,17 @@
     ]);
   }
 
+  test_propertyAccess_field_toplevel_generic() async {
+    await assertErrorsInCode('''
+class C<T> {
+  List<T> t = [];
+}
+var x = C.t;
+''', [
+      error(CompileTimeErrorCode.STATIC_ACCESS_TO_INSTANCE_MEMBER, 43, 1),
+    ]);
+  }
+
   test_propertyAccess_getter() async {
     await assertErrorsInCode('''
 class A {
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 2529d3a..40513d8 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -413,6 +413,10 @@
 import 'missing_return_test.dart' as missing_return;
 import 'missing_size_annotation_carray_test.dart'
     as missing_size_annotation_carray;
+import 'mixin_application_concrete_super_invoked_member_type_test.dart'
+    as mixin_application_concrete_super_invoked_member_type;
+import 'mixin_application_no_concrete_super_invoked_member_test.dart'
+    as mixin_application_no_concrete_super_invoked_member;
 import 'mixin_application_not_implemented_interface_test.dart'
     as mixin_application_not_implemented_interface;
 import 'mixin_class_declares_constructor_test.dart'
@@ -423,6 +427,7 @@
     as mixin_inference_no_possible_substitution;
 import 'mixin_inherits_from_not_object_test.dart'
     as mixin_inherits_from_not_object;
+import 'mixin_instantiate_test.dart' as mixin_instantiate_test;
 import 'mixin_of_disallowed_class_test.dart' as mixin_of_disallowed_class;
 import 'mixin_of_non_class_test.dart' as mixin_of_non_class;
 import 'mixin_of_type_alias_expands_to_type_parameter_test.dart'
@@ -430,6 +435,10 @@
 import 'mixin_on_sealed_class_test.dart' as mixin_on_sealed_class;
 import 'mixin_on_type_alias_expands_to_type_parameter_test.dart'
     as mixin_on_type_alias_expands_to_type_parameter;
+import 'mixin_super_class_constraint_deferred_class_test.dart'
+    as mixin_super_class_constraint_deferred_class;
+import 'mixin_super_class_constraint_disallowed_class_test.dart'
+    as mixin_super_class_constraint_disallowed_class;
 import 'mixin_super_class_constraint_non_interface_test.dart'
     as mixin_super_class_constraint_non_interface;
 import 'mixin_with_non_class_superclass_test.dart'
@@ -690,6 +699,7 @@
     as undefined_referenced_parameter;
 import 'undefined_setter_test.dart' as undefined_setter;
 import 'undefined_shown_name_test.dart' as undefined_shown_name;
+import 'undefined_super_method_test.dart' as undefined_super_method;
 import 'unignorable_ignore_test.dart' as unignorable_ignore;
 import 'unnecessary_cast_test.dart' as unnecessary_cast;
 import 'unnecessary_ignore_test.dart' as unnecessary_ignore;
@@ -1005,17 +1015,22 @@
     missing_required_param.main();
     missing_return.main();
     missing_size_annotation_carray.main();
+    mixin_application_concrete_super_invoked_member_type.main();
+    mixin_application_no_concrete_super_invoked_member.main();
     mixin_application_not_implemented_interface.main();
     mixin_class_declares_constructor.main();
     mixin_declares_constructor.main();
     mixin_deferred_class.main();
     mixin_inference_no_possible_substitution.main();
     mixin_inherits_from_not_object.main();
+    mixin_instantiate_test.main();
     mixin_of_disallowed_class.main();
     mixin_of_non_class.main();
     mixin_of_type_alias_expands_to_type_parameter.main();
     mixin_on_sealed_class.main();
     mixin_on_type_alias_expands_to_type_parameter.main();
+    mixin_super_class_constraint_deferred_class.main();
+    mixin_super_class_constraint_disallowed_class.main();
     mixin_super_class_constraint_non_interface.main();
     mixin_with_non_class_superclass.main();
     mixins_super_class.main();
@@ -1194,6 +1209,7 @@
     undefined_referenced_parameter.main();
     undefined_setter.main();
     undefined_shown_name.main();
+    undefined_super_method.main();
     unignorable_ignore.main();
     unnecessary_import.main();
     unnecessary_cast.main();
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_super_method_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_super_method_test.dart
new file mode 100644
index 0000000..0c1192c
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/undefined_super_method_test.dart
@@ -0,0 +1,36 @@
+// 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.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/context_collection_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UndefinedSuperMethodTest);
+  });
+}
+
+@reflectiveTest
+class UndefinedSuperMethodTest extends PubPackageResolutionTest {
+  test_error_undefinedSuperMethod() async {
+    await assertErrorsInCode(r'''
+class A {}
+
+mixin M on A {
+  void bar() {
+    super.foo(42);
+  }
+}
+''', [
+      error(CompileTimeErrorCode.UNDEFINED_SUPER_METHOD, 52, 3),
+    ]);
+
+    var invocation = findNode.methodInvocation('foo(42)');
+    assertElementNull(invocation.methodName);
+    assertInvokeTypeDynamic(invocation);
+    assertTypeDynamic(invocation);
+  }
+}
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 5b4aab2..09f2671 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -213,7 +213,6 @@
       selfUriStr: selfUriStr,
       sink: buffer,
       indent: indent,
-      withNullability: true,
       withOffsets: true,
     );
   }
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index 3ca0b95..e7a44e0 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -33,9 +33,6 @@
   /// The optional provider for code lines, might be `null`.
   final CodeLinesProvider? _codeLinesProvider;
 
-  /// If `true`, types should be printed with nullability suffixes.
-  final bool _withNullability;
-
   /// If `true`, selected tokens and nodes should be printed with offsets.
   final bool _withOffsets;
 
@@ -46,12 +43,10 @@
     required StringSink sink,
     required String indent,
     CodeLinesProvider? codeLinesProvider,
-    bool withNullability = false,
     bool withOffsets = false,
   })  : _selfUriStr = selfUriStr,
         _sink = sink,
         _codeLinesProvider = codeLinesProvider,
-        _withNullability = withNullability,
         _withOffsets = withOffsets,
         _indent = indent;
 
@@ -1830,7 +1825,7 @@
 
   /// TODO(scheglov) Make [type] non-nullable?
   String? _typeStr(DartType? type) {
-    return type?.getDisplayString(withNullability: _withNullability);
+    return type?.getDisplayString(withNullability: true);
   }
 
   void _withIndent(void Function() f) {
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 2610746..d171c1a 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -17983,6 +17983,299 @@
 ''');
   }
 
+  test_enum_getter() async {
+    var library = await checkLibrary(r'''
+enum E{
+  v;
+  int get foo => 0;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @5
+        supertype: Enum
+        fields
+          static const enumConstant v @10
+            type: E
+            constantInitializer
+              InstanceCreationExpression
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: ConstructorName
+                  name: SimpleIdentifier
+                    staticElement: self::@enum::E::@constructor::•
+                    staticType: null
+                    token:  @-1
+                  period: . @0
+                  staticElement: self::@enum::E::@constructor::•
+                  type: NamedType
+                    name: SimpleIdentifier
+                      staticElement: self::@enum::E
+                      staticType: null
+                      token: E @-1
+                    type: E
+                staticType: E
+          synthetic static const values @-1
+            type: List<E>
+            constantInitializer
+              ListLiteral
+                elements
+                  SimpleIdentifier
+                    staticElement: self::@enum::E::@getter::v
+                    staticType: E
+                    token: v @-1
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E>
+          synthetic final index @-1
+            type: int
+          synthetic foo @-1
+            type: int
+        constructors
+          synthetic const @-1
+        accessors
+          synthetic static get v @-1
+            returnType: E
+          synthetic static get values @-1
+            returnType: List<E>
+          synthetic get index @-1
+            returnType: int
+          get foo @23
+            returnType: int
+        methods
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
+  test_enum_interfaces() async {
+    var library = await checkLibrary(r'''
+class I {}
+enum E implements I {
+  v;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class I @6
+        constructors
+          synthetic @-1
+    enums
+      enum E @16
+        supertype: Enum
+        interfaces
+          I
+        fields
+          static const enumConstant v @35
+            type: E
+            constantInitializer
+              InstanceCreationExpression
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: ConstructorName
+                  name: SimpleIdentifier
+                    staticElement: self::@enum::E::@constructor::•
+                    staticType: null
+                    token:  @-1
+                  period: . @0
+                  staticElement: self::@enum::E::@constructor::•
+                  type: NamedType
+                    name: SimpleIdentifier
+                      staticElement: self::@enum::E
+                      staticType: null
+                      token: E @-1
+                    type: E
+                staticType: E
+          synthetic static const values @-1
+            type: List<E>
+            constantInitializer
+              ListLiteral
+                elements
+                  SimpleIdentifier
+                    staticElement: self::@enum::E::@getter::v
+                    staticType: E
+                    token: v @-1
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E>
+          synthetic final index @-1
+            type: int
+        constructors
+          synthetic const @-1
+        accessors
+          synthetic static get v @-1
+            returnType: E
+          synthetic static get values @-1
+            returnType: List<E>
+          synthetic get index @-1
+            returnType: int
+        methods
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
+  test_enum_interfaces_generic() async {
+    var library = await checkLibrary(r'''
+class I<T> {}
+enum E<U> implements I<U> {
+  v;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class I @6
+        typeParameters
+          covariant T @8
+            defaultType: dynamic
+        constructors
+          synthetic @-1
+    enums
+      enum E @19
+        typeParameters
+          covariant U @21
+            defaultType: dynamic
+        supertype: Enum
+        interfaces
+          I<U>
+        fields
+          static const enumConstant v @44
+            type: E<dynamic>
+            constantInitializer
+              InstanceCreationExpression
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: ConstructorName
+                  name: SimpleIdentifier
+                    staticElement: ConstructorMember
+                      base: self::@enum::E::@constructor::•
+                      substitution: {U: dynamic}
+                    staticType: null
+                    token:  @-1
+                  period: . @0
+                  staticElement: ConstructorMember
+                    base: self::@enum::E::@constructor::•
+                    substitution: {U: dynamic}
+                  type: NamedType
+                    name: SimpleIdentifier
+                      staticElement: self::@enum::E
+                      staticType: null
+                      token: E @-1
+                    type: E<dynamic>
+                staticType: E<dynamic>
+          synthetic static const values @-1
+            type: List<E<dynamic>>
+            constantInitializer
+              ListLiteral
+                elements
+                  SimpleIdentifier
+                    staticElement: self::@enum::E::@getter::v
+                    staticType: E<dynamic>
+                    token: v @-1
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E<dynamic>>
+          synthetic final index @-1
+            type: int
+        constructors
+          synthetic const @-1
+        accessors
+          synthetic static get v @-1
+            returnType: E<dynamic>
+          synthetic static get values @-1
+            returnType: List<E<dynamic>>
+          synthetic get index @-1
+            returnType: int
+        methods
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
+  test_enum_interfaces_unresolved() async {
+    var library = await checkLibrary('''
+class X {}
+class Z {}
+enum E implements X, Y, Z {
+  v
+}
+''', allowErrors: true);
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      class X @6
+        constructors
+          synthetic @-1
+      class Z @17
+        constructors
+          synthetic @-1
+    enums
+      enum E @27
+        supertype: Enum
+        interfaces
+          X
+          Z
+        fields
+          static const enumConstant v @52
+            type: E
+            constantInitializer
+              InstanceCreationExpression
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: ConstructorName
+                  name: SimpleIdentifier
+                    staticElement: self::@enum::E::@constructor::•
+                    staticType: null
+                    token:  @-1
+                  period: . @0
+                  staticElement: self::@enum::E::@constructor::•
+                  type: NamedType
+                    name: SimpleIdentifier
+                      staticElement: self::@enum::E
+                      staticType: null
+                      token: E @-1
+                    type: E
+                staticType: E
+          synthetic static const values @-1
+            type: List<E>
+            constantInitializer
+              ListLiteral
+                elements
+                  SimpleIdentifier
+                    staticElement: self::@enum::E::@getter::v
+                    staticType: E
+                    token: v @-1
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E>
+          synthetic final index @-1
+            type: int
+        constructors
+          synthetic const @-1
+        accessors
+          synthetic static get v @-1
+            returnType: E
+          synthetic static get values @-1
+            returnType: List<E>
+          synthetic get index @-1
+            returnType: int
+        methods
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
   test_enum_method() async {
     var library = await checkLibrary(r'''
 enum E<T> {
@@ -18127,6 +18420,234 @@
 ''');
   }
 
+  test_enum_mixins() async {
+    var library = await checkLibrary(r'''
+mixin M {}
+enum E with M {
+  v;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @16
+        supertype: Enum
+        mixins
+          M
+        fields
+          static const enumConstant v @29
+            type: E
+            constantInitializer
+              InstanceCreationExpression
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: ConstructorName
+                  name: SimpleIdentifier
+                    staticElement: self::@enum::E::@constructor::•
+                    staticType: null
+                    token:  @-1
+                  period: . @0
+                  staticElement: self::@enum::E::@constructor::•
+                  type: NamedType
+                    name: SimpleIdentifier
+                      staticElement: self::@enum::E
+                      staticType: null
+                      token: E @-1
+                    type: E
+                staticType: E
+          synthetic static const values @-1
+            type: List<E>
+            constantInitializer
+              ListLiteral
+                elements
+                  SimpleIdentifier
+                    staticElement: self::@enum::E::@getter::v
+                    staticType: E
+                    token: v @-1
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E>
+          synthetic final index @-1
+            type: int
+        constructors
+          synthetic const @-1
+        accessors
+          synthetic static get v @-1
+            returnType: E
+          synthetic static get values @-1
+            returnType: List<E>
+          synthetic get index @-1
+            returnType: int
+        methods
+          synthetic toString @-1
+            returnType: String
+    mixins
+      mixin M @6
+        superclassConstraints
+          Object
+        constructors
+          synthetic @-1
+''');
+  }
+
+  test_enum_mixins_inference() async {
+    var library = await checkLibrary(r'''
+mixin M1<T> {}
+mixin M2<T> on M1<T> {}
+enum E with M1<int>, M2 {
+  v;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @44
+        supertype: Enum
+        mixins
+          M1<int>
+          M2<int>
+        fields
+          static const enumConstant v @67
+            type: E
+            constantInitializer
+              InstanceCreationExpression
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: ConstructorName
+                  name: SimpleIdentifier
+                    staticElement: self::@enum::E::@constructor::•
+                    staticType: null
+                    token:  @-1
+                  period: . @0
+                  staticElement: self::@enum::E::@constructor::•
+                  type: NamedType
+                    name: SimpleIdentifier
+                      staticElement: self::@enum::E
+                      staticType: null
+                      token: E @-1
+                    type: E
+                staticType: E
+          synthetic static const values @-1
+            type: List<E>
+            constantInitializer
+              ListLiteral
+                elements
+                  SimpleIdentifier
+                    staticElement: self::@enum::E::@getter::v
+                    staticType: E
+                    token: v @-1
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E>
+          synthetic final index @-1
+            type: int
+        constructors
+          synthetic const @-1
+        accessors
+          synthetic static get v @-1
+            returnType: E
+          synthetic static get values @-1
+            returnType: List<E>
+          synthetic get index @-1
+            returnType: int
+        methods
+          synthetic toString @-1
+            returnType: String
+    mixins
+      mixin M1 @6
+        typeParameters
+          covariant T @9
+            defaultType: dynamic
+        superclassConstraints
+          Object
+        constructors
+          synthetic @-1
+      mixin M2 @21
+        typeParameters
+          covariant T @24
+            defaultType: dynamic
+        superclassConstraints
+          M1<T>
+        constructors
+          synthetic @-1
+''');
+  }
+
+  test_enum_setter() async {
+    var library = await checkLibrary(r'''
+enum E{
+  v;
+  set foo(int _) {}
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @5
+        supertype: Enum
+        fields
+          static const enumConstant v @10
+            type: E
+            constantInitializer
+              InstanceCreationExpression
+                argumentList: ArgumentList
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: ConstructorName
+                  name: SimpleIdentifier
+                    staticElement: self::@enum::E::@constructor::•
+                    staticType: null
+                    token:  @-1
+                  period: . @0
+                  staticElement: self::@enum::E::@constructor::•
+                  type: NamedType
+                    name: SimpleIdentifier
+                      staticElement: self::@enum::E
+                      staticType: null
+                      token: E @-1
+                    type: E
+                staticType: E
+          synthetic static const values @-1
+            type: List<E>
+            constantInitializer
+              ListLiteral
+                elements
+                  SimpleIdentifier
+                    staticElement: self::@enum::E::@getter::v
+                    staticType: E
+                    token: v @-1
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E>
+          synthetic final index @-1
+            type: int
+          synthetic foo @-1
+            type: int
+        constructors
+          synthetic const @-1
+        accessors
+          synthetic static get v @-1
+            returnType: E
+          synthetic static get values @-1
+            returnType: List<E>
+          synthetic get index @-1
+            returnType: int
+          set foo @19
+            parameters
+              requiredPositional _ @27
+                type: int
+            returnType: void
+        methods
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
   test_enum_typeParameters() async {
     var library = await checkLibrary('''
 enum E<T> {
diff --git a/pkg/compiler/lib/src/common/resolution.dart b/pkg/compiler/lib/src/common/resolution.dart
index 37c495b..0156152 100644
--- a/pkg/compiler/lib/src/common/resolution.dart
+++ b/pkg/compiler/lib/src/common/resolution.dart
@@ -6,6 +6,7 @@
 
 import '../constants/values.dart' show ConstantValue;
 import '../elements/entities.dart';
+import '../native/behavior.dart' show NativeBehavior;
 import '../universe/world_impact.dart' show WorldImpact;
 import '../universe/feature.dart';
 
@@ -20,8 +21,7 @@
   Iterable<ConstantValue> get constantLiterals => const <ConstantValue>[];
   Iterable<ClassEntity> get seenClasses => const <ClassEntity>[];
   Iterable<RuntimeTypeUse> get runtimeTypeUses => const <RuntimeTypeUse>[];
-
-  Iterable<dynamic> get nativeData => const <dynamic>[];
+  Iterable<NativeBehavior> get nativeData => const <NativeBehavior>[];
 
   Iterable<GenericInstantiation> get genericInstantiations =>
       const <GenericInstantiation>[];
diff --git a/pkg/compiler/lib/src/js_backend/minify_namer.dart b/pkg/compiler/lib/src/js_backend/minify_namer.dart
index 82c7200..07f2138 100644
--- a/pkg/compiler/lib/src/js_backend/minify_namer.dart
+++ b/pkg/compiler/lib/src/js_backend/minify_namer.dart
@@ -44,33 +44,61 @@
     return freshName;
   }
 
-  // From issue 7554.  These should not be used on objects (as instance
-  // variables) because they clash with names from the DOM. However, it is
-  // OK to use them as fields, as we only access fields directly if we know
-  // the receiver type.
+  /// Property names that are used on 'native' JavaScript classes.
+  ///
+  /// It is best not to use these names for dynamic call selectors.
+  ///
+  /// Dynamic calls to selectors that are used on an intercepted (e.g. String)
+  /// class (e.g. String) or native class (e.g. HtmlElement) are not a problem
+  /// since they are handled via the interceptor calling mechanism. Other
+  /// selectors are called directly, so the minified selector should not be a
+  /// name that accidentally collides with a JavaScript method.  For example,
+  /// the minified call site for the dynamic call `item.yowza()` should not be
+  /// `x.at()`, since, if `x` was a String, that would call
+  /// `String.prototype.at` instead of generating an error.
+  ///
+  /// These names are reserved for the property names of fields, since fields
+  /// are always accessed from a know receiver. (A 'field' of an unknown
+  /// receiver would actually be the getter method.)
+  ///
+  /// These names could be used for selectors that use the interceptor calling
+  /// convention, or for selectors are not called from a `dynamic` call site, or
+  /// any other use where the JavaScript receiver is constrained to be something
+  /// from within the dart program.
+  ///
+  /// TODO(7554): Refresh periodically.
   static const List<String> _reservedNativeProperties = [
-    'a', 'b', 'c', 'd', 'e', 'f', 'r', 'x', 'y', 'z', 'Q',
-    // 2-letter:
-    'ch', 'cx', 'cy', 'db', 'dx', 'dy', 'fr', 'fx', 'fy', 'go', 'id', 'k1',
-    'k2', 'k3', 'k4', 'r1', 'r2', 'rx', 'ry', 'x1', 'x2', 'y1', 'y2',
-    // 3-letter:
-    'add', 'all', 'alt', 'arc', 'CCW', 'cmp', 'dir', 'end', 'get', 'in1',
-    'in2', 'INT', 'key', 'log', 'low', 'm11', 'm12', 'm13', 'm14', 'm21',
-    'm22', 'm23', 'm24', 'm31', 'm32', 'm33', 'm34', 'm41', 'm42', 'm43',
-    'm44', 'max', 'min', 'now', 'ONE', 'put', 'red', 'rel', 'rev', 'RGB',
-    'sdp', 'set', 'src', 'tag', 'top', 'uid', 'uri', 'url', 'URL',
-    // 4-letter:
-    'abbr', 'atob', 'Attr', 'axes', 'axis', 'back', 'BACK', 'beta', 'bias',
-    'Blob', 'blue', 'blur', 'BLUR', 'body', 'BOOL', 'BOTH', 'btoa', 'BYTE',
-    'cite', 'clip', 'code', 'cols', 'cues', 'data', 'DECR', 'DONE', 'face',
-    'file', 'File', 'fill', 'find', 'font', 'form', 'gain', 'hash', 'head',
-    'high', 'hint', 'host', 'href', 'HRTF', 'IDLE', 'INCR', 'info', 'INIT',
-    'isId', 'item', 'KEEP', 'kind', 'knee', 'lang', 'left', 'LESS', 'line',
-    'link', 'list', 'load', 'loop', 'mode', 'name', 'Node', 'None', 'NONE',
-    'only', 'open', 'OPEN', 'ping', 'play', 'port', 'rect', 'Rect', 'refX',
-    'refY', 'RGBA', 'root', 'rows', 'save', 'seed', 'seek', 'self', 'send',
-    'show', 'SINE', 'size', 'span', 'stat', 'step', 'stop', 'tags', 'text',
-    'Text', 'time', 'type', 'view', 'warn', 'wrap', 'ZERO'
+    // 1 character
+    'a', 'b', 'c', 'd', 'e', 'f', 'r', 'w', 'x', 'y', 'z', 'Q',
+
+    // 2 characters
+    'as', 'at', 'ax', 'ay', 'ch', 'CW', 'cx', 'cy', 'db', 'dx', 'dy', 'fr',
+    'fx', 'fy', 'go', 'id', 'k1', 'k2', 'k3', 'k4', 'ok', 'p1', 'p2', 'p3',
+    'p4', 'R8', 'RG', 'rx', 'ry', 'to', 'x1', 'x2', 'xr', 'y1', 'y2',
+
+    // 3 characters
+    'add', 'all', 'alt', 'arc', 'big', 'CCW', 'cmp', 'csp', 'dir', 'div', 'end',
+    'eye', 'get', 'has', 'hid', 'in1', 'in2', 'ink', 'INT', 'key', 'low', 'm11',
+    'm12', 'm13', 'm14', 'm21', 'm22', 'm23', 'm24', 'm31', 'm32', 'm33', 'm34',
+    'm41', 'm42', 'm43', 'm44', 'map', 'max', 'MAX', 'mid', 'min', 'MIN', 'mul',
+    'now', 'ONE', 'pad', 'pan', 'pop', 'put', 'R8I', 'RED', 'rel', 'rev', 'RG8',
+    'RGB', 'rtt', 'sdp', 'set', 'src', 'sub', 'sup', 'tag', 'tee', 'top', 'upX',
+    'upY', 'upZ', 'url', 'URL', 'usb',
+
+    // 4 characters
+    'abbr', 'axes', 'axis', 'back', 'BACK', 'beta', 'bias', 'bind', 'blob',
+    'blur', 'body', 'bold', 'BOOL', 'BYTE', 'call', 'cite', 'city', 'clip',
+    'code', 'cols', 'cues', 'data', 'DECR', 'DONE', 'dtmf', 'exec', 'face',
+    'fill', 'find', 'flat', 'font', 'form', 'gain', 'hash', 'head', 'hide',
+    'high', 'hint', 'host', 'href', 'icon', 'INCR', 'is2D', 'item', 'join',
+    'json', 'KEEP', 'keys', 'kind', 'knee', 'lang', 'left', 'LESS', 'line',
+    'link', 'list', 'load', 'lock', 'loop', 'mark', 'mode', 'name', 'node',
+    'NONE', 'open', 'OPEN', 'part', 'path', 'ping', 'play', 'port', 'push',
+    'R16F', 'R16I', 'R32F', 'R32I', 'R8UI', 'rate', 'read', 'rect', 'refX',
+    'refY', 'RG8I', 'RGB8', 'RGBA', 'role', 'root', 'rows', 'save', 'sctp',
+    'seed', 'seek', 'send', 'show', 'sign', 'size', 'slot', 'some', 'sort',
+    'span', 'SRGB', 'step', 'stop', 'sync', 'test', 'text', 'then', 'time',
+    'tone', 'trim', 'type', 'unit', 'view', 'wrap', 'ZERO',
   ];
 
   void reserveBackendNames() {
diff --git a/pkg/compiler/lib/src/resolution/registry.dart b/pkg/compiler/lib/src/resolution/registry.dart
index 9435c0b..0d4480f 100644
--- a/pkg/compiler/lib/src/resolution/registry.dart
+++ b/pkg/compiler/lib/src/resolution/registry.dart
@@ -8,6 +8,7 @@
 import '../constants/values.dart';
 import '../elements/entities.dart' show ClassEntity, MemberEntity;
 import '../elements/types.dart';
+import '../native/behavior.dart' show NativeBehavior;
 import '../universe/feature.dart';
 import '../universe/world_impact.dart' show WorldImpact, WorldImpactBuilderImpl;
 import '../util/enumset.dart' show EnumSet;
@@ -24,7 +25,7 @@
   Setlet<ListLiteralUse> _listLiterals;
   Setlet<String> _constSymbolNames;
   Setlet<ConstantValue> _constantLiterals;
-  Setlet<dynamic> _nativeData;
+  Setlet<NativeBehavior> _nativeData;
   Setlet<ClassEntity> _seenClasses;
   Set<RuntimeTypeUse> _runtimeTypeUses;
   Set<GenericInstantiation> _genericInstantiations;
@@ -98,14 +99,14 @@
   @override
   Iterable<ConstantValue> get constantLiterals => _constantLiterals ?? const [];
 
-  void registerNativeData(dynamic nativeData) {
+  void registerNativeData(NativeBehavior nativeData) {
     assert(nativeData != null);
     _nativeData ??= Setlet();
     _nativeData.add(nativeData);
   }
 
   @override
-  Iterable<dynamic> get nativeData => _nativeData ?? const [];
+  Iterable<NativeBehavior> get nativeData => _nativeData ?? const [];
 
   void registerSeenClass(ClassEntity seenClass) {
     _seenClasses ??= Setlet();
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 7bd3dde..8c57682 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -3760,12 +3760,22 @@
 /// The part of string interpolation which converts and interpolated expression
 /// into a String value.
 class HStringify extends HInstruction {
+  bool _isPure = false; // Some special cases are pure, e.g. int argument.
   HStringify(HInstruction input, AbstractValue resultType)
       : super([input], resultType) {
     sideEffects.setAllSideEffects();
     sideEffects.setDependsOnSomething();
   }
 
+  void setPure() {
+    sideEffects.clearAllDependencies();
+    sideEffects.clearAllSideEffects();
+    _isPure = true;
+  }
+
+  @override
+  bool canThrow(AbstractValueDomain domain) => !_isPure;
+
   @override
   accept(HVisitor visitor) => visitor.visitStringify(this);
   @override
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 0475798..3b1f064 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -1918,6 +1918,13 @@
       return null;
     }
 
+    // For primitives we know the stringifier is effect-free and never throws.
+    if (input.isNumberOrNull(_abstractValueDomain).isDefinitelyTrue ||
+        input.isStringOrNull(_abstractValueDomain).isDefinitelyTrue ||
+        input.isBooleanOrNull(_abstractValueDomain).isDefinitelyTrue) {
+      node.setPure();
+    }
+
     return tryConstant() ?? tryToString() ?? node;
   }
 
diff --git a/pkg/compiler/lib/src/universe/resolution_world_builder.dart b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
index 7683874..ca69de6 100644
--- a/pkg/compiler/lib/src/universe/resolution_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
@@ -34,11 +34,6 @@
 import 'world_builder.dart';
 
 abstract class ResolutionWorldBuilder implements WorldBuilder, OpenWorld {
-  /// Returns `true` if [member] has been marked as used (called, read, etc.) in
-  /// this world builder.
-  // TODO(johnniwinther): Maybe this should be part of [ClosedWorld] (instead).
-  bool isMemberUsed(MemberEntity member);
-
   /// The closed world computed by this world builder.
   ///
   /// This is only available after the world builder has been closed.
@@ -903,11 +898,6 @@
     }
   }
 
-  @override
-  bool isMemberUsed(MemberEntity member) {
-    return _memberUsage[member]?.hasUse ?? false;
-  }
-
   Map<ClassEntity, Set<ClassEntity>> populateHierarchyNodes() {
     Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses = {};
 
diff --git a/pkg/compiler/tool/used_names/README.md b/pkg/compiler/tool/used_names/README.md
new file mode 100644
index 0000000..5fd8bf6
--- /dev/null
+++ b/pkg/compiler/tool/used_names/README.md
@@ -0,0 +1,52 @@
+## used_names.html
+
+To run this program, visit
+[`pkg/compiler/tool/used_names/used_names.html`](used_names.html) in a browser.
+
+The page will display a list of short names that are defined as properties on
+all the objects available from `window`. The names are sorted by size, and then
+alphabetically ignoring case, and finally by case. They are quoted for easy
+copy-paste into a Dart source file.
+
+This data is to be used for editing tables of names that the minifying namer
+should avoid in some circumstances.  These names should be in the table, but
+other names might need to be in the table too.
+
+### Why these names?
+
+There are contexts where dart2js generates `a.b()` with the expectation that it
+will either call an instance method in the Dart program or crash with a
+JavaScript TypeError for an undefined function. The minifier code can't use
+certain names for `b` since it won't crash, for example `toString`, or `length`,
+which might result in a less clear diagnostic.
+
+An example of this use is in dynamic calls to methods that do not need the
+special 'interceptor' calling convention used on native objects like Arrays,
+Strings, numbers and @Native classes. Dynamic calls use the same selector as
+instance calls.
+
+In unminified code we arrange that the selectors are descriptive of the call
+site structure, e.g. `toString$0` or `get$length`. These generally are not
+defined in the execution environment.
+
+For minified code, we want to pick names as short as possible, so there is a
+chance that the short names will conflict with one defined in the environment.
+For example, minifying something to `a.at()` might call `String.prototype.at`.
+
+### Discussion
+
+In retrospect the decision to use names that Dart has no control over is not the
+best. When this part of the compiler was written, the language was still very
+dynamic (Dart 1) and there were very few program that extensively used
+JavaScript interop.
+
+Now that typical programs contain many fewer dynamic calls, perhaps it is time
+to make the calling convention for dynamic call different to that for instance
+method calls. One idea is we could start by making dynamic calls have a
+different selector. This selector would eventually be a fully-checked entry
+point, but initially it could just be an alias for the instance-call entry
+point. The alias could be a JavaScript Symbol, or for legacy browsers, always
+start with `dyn$`, even when minified.
+
+
+
diff --git a/pkg/compiler/tool/used_names/used_names.html b/pkg/compiler/tool/used_names/used_names.html
new file mode 100644
index 0000000..349c3c2
--- /dev/null
+++ b/pkg/compiler/tool/used_names/used_names.html
@@ -0,0 +1,6 @@
+<!--
+// 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.
+-->
+<script src="used_names.js" defer></script>
diff --git a/pkg/compiler/tool/used_names/used_names.js b/pkg/compiler/tool/used_names/used_names.js
new file mode 100644
index 0000000..6d9c4c2
--- /dev/null
+++ b/pkg/compiler/tool/used_names/used_names.js
@@ -0,0 +1,55 @@
+// 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.
+
+// Script to find all short names used prototypes of global definitions.  This
+// can be used as a basis for a list of names to avoid for dynamic method
+// selectors.
+//
+// TODO(7554): Update compiler regularly.
+
+function analyze() {
+  let names = Object.create(null)
+  for (var global of Object.getOwnPropertyNames(self)) {
+    let value = window[global];
+    if (typeof value != "function") continue;
+    let prototype = value.prototype;
+    if (prototype == null) continue;
+    while (prototype != null) {
+      for (let name of Object.getOwnPropertyNames(prototype)) {
+        if (name.length > 4) continue;
+        names[name] = 1;
+      }
+      prototype = Object.getPrototypeOf(prototype);
+    }
+  }
+
+  names = Object.keys(names);
+
+  function byLengthThenName(a, b) {
+    if (a.length != b.length) return a.length - b.length;
+    let a_lc = a.toLowerCase();
+    let b_lc = b.toLowerCase();
+    if (a_lc < b_lc) return -1;
+    if (a_lc > b_lc) return 1;
+    if (a > b) return -1;
+    if (a < b) return 1;
+    return 0;
+  }
+  names.sort(byLengthThenName);
+
+  return names;
+}
+
+function display(names) {
+  console.log(names)
+  let div = document.createElement('div');
+  document.body.appendChild(div);
+  div.style.fontFamily = 'courier'
+  for (let name of names) {
+    div.appendChild(document.createTextNode("'" + name + "',"))
+    div.appendChild(document.createElement("br"));
+  }
+}
+
+display(analyze());
diff --git a/pkg/dartdev/analysis_options.yaml b/pkg/dartdev/analysis_options.yaml
index 3faacee..094baf6 100644
--- a/pkg/dartdev/analysis_options.yaml
+++ b/pkg/dartdev/analysis_options.yaml
@@ -8,4 +8,5 @@
     # Enable additional rules.
     depend_on_referenced_packages: true
     directives_ordering: true
+    prefer_single_quotes: true
     sort_pub_dependencies: true
diff --git a/pkg/dartdev/lib/src/commands/doc.dart b/pkg/dartdev/lib/src/commands/doc.dart
index 11e1df7..907bba6 100644
--- a/pkg/dartdev/lib/src/commands/doc.dart
+++ b/pkg/dartdev/lib/src/commands/doc.dart
@@ -67,13 +67,13 @@
       // At least one argument, the input directory, is required,
       // when we're not generating docs for the Dart SDK.
       if (args.rest.isEmpty) {
-        usageException("Error: Input directory not specified");
+        usageException('Error: Input directory not specified');
       }
 
       // Determine input directory.
       final dir = io.Directory(args.rest[0]);
       if (!dir.existsSync()) {
-        usageException("Error: Input directory doesn't exist: ${dir.path}");
+        usageException('Error: Input directory doesn\'t exist: ${dir.path}');
       }
       options.add('--input=${dir.path}');
     }
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index ea0ce59..94b0141 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -20,7 +20,7 @@
 import '../vm_interop_handler.dart';
 
 class RunCommand extends DartdevCommand {
-  static const bool isProductMode = bool.fromEnvironment("dart.vm.product");
+  static const bool isProductMode = bool.fromEnvironment('dart.vm.product');
   static const String cmdName = 'run';
 
   // kErrorExitCode, as defined in runtime/bin/error_exit.h
diff --git a/pkg/dartdev/test/no_such_file_test.dart b/pkg/dartdev/test/no_such_file_test.dart
index 1208a5e..4d8032d 100644
--- a/pkg/dartdev/test/no_such_file_test.dart
+++ b/pkg/dartdev/test/no_such_file_test.dart
@@ -33,7 +33,7 @@
     expect(result.stderr, isNotEmpty);
     expect(result.stderr, contains("Error when reading 'foo.dart':"));
     expect(result.stdout, isNotEmpty);
-    expect(result.stdout, contains("Info: Compiling with sound null safety\n"));
+    expect(result.stdout, contains('Info: Compiling with sound null safety\n'));
     expect(result.exitCode, 254);
   });
 }
diff --git a/pkg/dev_compiler/test/worker/worker_test.dart b/pkg/dev_compiler/test/worker/worker_test.dart
index 25a4474..6e3e03e 100644
--- a/pkg/dev_compiler/test/worker/worker_test.dart
+++ b/pkg/dev_compiler/test/worker/worker_test.dart
@@ -18,10 +18,12 @@
 void main() {
   var baseArgs = <String>[];
   final executableArgs = <String>[
-    Platform.script.resolve('../../bin/dartdevc.dart').path,
+    Platform.script
+        .resolve('../../bin/dartdevc.dart')
+        .toFilePath(windows: Platform.isWindows),
     '--sound-null-safety',
     '--dart-sdk-summary',
-    Uri.parse(Platform.resolvedExecutable)
+    Uri.file(Platform.resolvedExecutable, windows: Platform.isWindows)
         .resolve('ddc_outline_sound.dill')
         .path
   ];
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 2aabaff..5e0c376 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -1731,6 +1731,16 @@
         }
       }
 
+      // Setup scope first in two-step process:
+      // 1) Create a new SourceLibraryBuilder, add imports and setup (import)
+      //    scope.
+      // 2) Create a new SourceLibraryBuilder, using a nested scope of the scope
+      //    we just created as the scope. The import scopes have been setup via
+      //    the parent chain.
+      // This is done to create the correct "layering" (i.e. definitions from
+      // the "self" library first, then imports while not having dill builders
+      // directly in the scope of a source builder (which can crash things in
+      // some circumstances).
       SourceLibraryBuilder debugLibrary = new SourceLibraryBuilder(
         importUri: libraryUri,
         fileUri: debugExprUri,
@@ -1784,6 +1794,16 @@
         debugLibrary.addImportsToScope();
         _ticker.logMs("Added imports");
       }
+      debugLibrary = new SourceLibraryBuilder(
+        importUri: libraryUri,
+        fileUri: debugExprUri,
+        packageLanguageVersion:
+            new ImplicitLanguageVersion(libraryBuilder.library.languageVersion),
+        loader: lastGoodKernelTarget.loader,
+        scope: debugLibrary.scope.createNestedScope("expression"),
+        nameOrigin: libraryBuilder,
+        isUnsupported: libraryBuilder.isUnsupported,
+      );
 
       HybridFileSystem hfs =
           lastGoodKernelTarget.fileSystem as HybridFileSystem;
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 89b7847..e083a04 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1712,11 +1712,11 @@
     }
 
     List<Initializer>? initializers = _initializers;
-    if (initializers != null) {
-      if (libraryBuilder.enableSuperParametersInLibrary) {
-        if (initializers.isNotEmpty && initializers.last is SuperInitializer) {
-          SuperInitializer superInitializer =
-              initializers.last as SuperInitializer;
+    if (initializers != null && initializers.isNotEmpty) {
+      if (initializers.last is SuperInitializer) {
+        SuperInitializer superInitializer =
+            initializers.last as SuperInitializer;
+        if (libraryBuilder.enableSuperParametersInLibrary) {
           Arguments arguments = superInitializer.arguments;
 
           if (positionalSuperParametersAsArguments != null) {
@@ -1742,23 +1742,24 @@
             arguments.named.addAll(namedSuperParametersAsArguments);
             setParents(namedSuperParametersAsArguments, arguments);
           }
-
-          LocatedMessage? message = checkArgumentsForFunction(
-              superInitializer.target.function,
-              arguments,
-              arguments.fileOffset, <TypeParameter>[]);
-          if (message != null) {
-            initializers[initializers.length - 1] = buildInvalidInitializer(
-                buildUnresolvedError(
-                    forest.createNullLiteral(superInitializer.fileOffset),
-                    constructorNameForDiagnostics(
-                        superInitializer.target.name.text),
-                    arguments,
-                    superInitializer.fileOffset,
-                    isSuper: true,
-                    message: message,
-                    kind: UnresolvedKind.Constructor));
-          }
+        } else if (libraryBuilder.enableEnhancedEnumsInLibrary) {
+          initializers[initializers.length - 1] = buildInvalidInitializer(
+              buildProblem(fasta.messageEnumConstructorSuperInitializer,
+                  superInitializer.fileOffset, noLength))
+            ..parent = constructor;
+        }
+      } else if (initializers.last is RedirectingInitializer) {
+        RedirectingInitializer redirectingInitializer =
+            initializers.last as RedirectingInitializer;
+        if (libraryBuilder.enableEnhancedEnumsInLibrary) {
+          redirectingInitializer.arguments.positional.insertAll(0, [
+            new VariableGetImpl(constructor.function.positionalParameters[0],
+                forNullGuardedAccess: false)
+              ..parent = redirectingInitializer.arguments,
+            new VariableGetImpl(constructor.function.positionalParameters[1],
+                forNullGuardedAccess: false)
+              ..parent = redirectingInitializer.arguments
+          ]);
         }
       }
 
@@ -1775,41 +1776,11 @@
         }
       }
     }
+
     if (asyncModifier != AsyncMarker.Sync) {
       constructor.initializers.add(buildInvalidInitializer(buildProblem(
           fasta.messageConstructorNotSync, body!.fileOffset, noLength)));
     }
-    if (libraryBuilder.enableEnhancedEnumsInLibrary &&
-        sourceClassBuilder is SourceEnumBuilder &&
-        constructor.initializers.isNotEmpty &&
-        constructor.initializers.last is RedirectingInitializer) {
-      RedirectingInitializer redirectingInitializer =
-          constructor.initializers.last as RedirectingInitializer;
-      redirectingInitializer.arguments.positional.insertAll(0, [
-        new VariableGet(constructor.function.positionalParameters[0])
-          ..parent = redirectingInitializer.arguments,
-        new VariableGet(constructor.function.positionalParameters[1])
-          ..parent = redirectingInitializer.arguments
-      ]);
-
-      LocatedMessage? message = checkArgumentsForFunction(
-          redirectingInitializer.target.function,
-          redirectingInitializer.arguments,
-          builder.charOffset, const <TypeParameter>[]);
-      if (message != null) {
-        Initializer invalidInitializer = buildInvalidInitializer(
-            buildUnresolvedError(
-                forest.createNullLiteral(redirectingInitializer.fileOffset),
-                constructorNameForDiagnostics(builder.name, isSuper: false),
-                redirectingInitializer.arguments,
-                redirectingInitializer.fileOffset,
-                isSuper: false,
-                message: message,
-                kind: UnresolvedKind.Constructor));
-        constructor.initializers.removeLast();
-        constructor.initializers.add(invalidInitializer..parent = constructor);
-      }
-    }
     if (needsImplicitSuperInitializer) {
       /// >If no superinitializer is provided, an implicit superinitializer
       /// >of the form super() is added at the end of k’s initializer list,
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index ec5e04c..f1e283a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -3219,6 +3219,9 @@
                     messageAbstractClassConstructorTearOff,
                     nameOffset,
                     name.text.length);
+              } else if (declarationBuilder.cls.isEnum) {
+                return _helper.buildProblem(messageEnumConstructorTearoff,
+                    nameOffset, name.text.length);
               }
               tearOffExpression = _helper.forest
                   .createConstructorTearOff(token.charOffset, tearOff);
@@ -4570,32 +4573,14 @@
       int offset, Name name, Arguments arguments) {
     Constructor? constructor =
         _helper.lookupConstructor(name, isSuper: isSuper);
-    LocatedMessage? message;
-    if (constructor != null) {
-      // The check of the arguments is done later for super initializers if the
-      // 'super-parameters' language feature is enabled. In that case the
-      // additional parameters can be added at a later stage.
-      bool isPotentialSuperParametersReceiver =
-          isSuper && _helper.libraryBuilder.enableSuperParametersInLibrary;
-      // Additional arguments are added to the redirecting initializer of an
-      // enum constructor, so the check is performed later.
-      bool isEnumConstructorRedirectingInitializer =
-          constructor.enclosingClass.isEnum;
-      if (!isPotentialSuperParametersReceiver &&
-          !isEnumConstructorRedirectingInitializer) {
-        message = _helper.checkArgumentsForFunction(
-            constructor.function, arguments, offset, <TypeParameter>[]);
-      }
-    } else {
+    if (constructor == null) {
       String fullName =
           _helper.constructorNameForDiagnostics(name.text, isSuper: isSuper);
-      message = (isSuper
+      LocatedMessage message = (isSuper
               ? templateSuperclassHasNoConstructor
               : templateConstructorNotFound)
           .withArguments(fullName)
           .withLocation(_uri, fileOffset, lengthForToken(token));
-    }
-    if (message != null) {
       return _helper.buildInvalidInitializer(
           _helper.buildUnresolvedError(
               _forest.createNullLiteral(offset),
@@ -4609,10 +4594,10 @@
           offset);
     } else if (isSuper) {
       return _helper.buildSuperInitializer(
-          false, constructor!, arguments, offset);
+          false, constructor, arguments, offset);
     } else {
       return _helper.buildRedirectingInitializer(
-          constructor!, arguments, offset);
+          constructor, arguments, offset);
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
index b5b8b97..878dc03b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
@@ -82,10 +82,39 @@
         (canonicalMember.classBuilder != classBuilder &&
             needsTypeOrCovarianceUpdate) ||
         needMixinStub;
-    bool needsSuperImpl = _superClassMember != null &&
-        _superClassMember!
+    bool needsSuperImpl = false;
+    Member? superTarget;
+    if (_superClassMember != null) {
+      superTarget =
+          _superClassMember!.getMember(_combinedMemberSignature.membersBuilder);
+      if (superTarget is Procedure &&
+          interfaceMember is Procedure &&
+          (superTarget.function.positionalParameters.length <
+                  interfaceMember.function.positionalParameters.length ||
+              superTarget.function.namedParameters.length <
+                  interfaceMember.function.namedParameters.length)) {
+        // [superTarget] is not a valid implementation for [interfaceMember]
+        // since [interfaceMember] has more parameters than [superTarget].
+        //
+        // For instance
+        //
+        //    class A {
+        //      void method() {}
+        //    }
+        //    abstract class B<T> extends A {
+        //      void method({T? a});
+        //    }
+        //
+        // Any concrete implementation of B must provide its own implementation
+        // of `B.method` and cannot forward to `A.method`.
+      } else {
+        // [superTarget] is a valid implementation for [interfaceMember] so
+        // we need to add concrete forwarding stub of the variances differ.
+        needsSuperImpl = _superClassMember!
                 .getCovariance(_combinedMemberSignature.membersBuilder) !=
             _combinedMemberSignature.combinedMemberSignatureCovariance;
+      }
+    }
     if (stubNeeded) {
       Procedure stub = _combinedMemberSignature.createMemberFromSignature(
           copyLocation: false)!;
@@ -124,7 +153,7 @@
         if (needsSuperImpl ||
             (needMixinStub && _superClassMember == _mixedInMember)) {
           _createForwardingImplIfNeeded(
-              stub.function, stub.name, classBuilder.cls,
+              stub.function, stub.name, classBuilder.cls, superTarget,
               isForwardingStub: needsForwardingStub);
         }
       }
@@ -136,16 +165,16 @@
             .applyCovariance(interfaceMember);
       }
       if (needsSuperImpl) {
-        _createForwardingImplIfNeeded(
-            interfaceMember.function!, interfaceMember.name, classBuilder.cls,
+        _createForwardingImplIfNeeded(interfaceMember.function!,
+            interfaceMember.name, classBuilder.cls, superTarget,
             isForwardingStub: true);
       }
       return null;
     }
   }
 
-  void _createForwardingImplIfNeeded(
-      FunctionNode function, Name name, Class enclosingClass,
+  void _createForwardingImplIfNeeded(FunctionNode function, Name name,
+      Class enclosingClass, Member? superTarget,
       {required bool isForwardingStub}) {
     // ignore: unnecessary_null_comparison
     assert(isForwardingStub != null);
@@ -155,12 +184,10 @@
     }
     // If there is no concrete implementation in the superclass, then the method
     // is fully abstract and we don't need to do anything.
-    if (_superClassMember == null) {
+    if (superTarget == null) {
       return;
     }
     Procedure procedure = function.parent as Procedure;
-    Member superTarget =
-        _superClassMember!.getMember(_combinedMemberSignature.membersBuilder);
     if (superTarget is Procedure && superTarget.isForwardingStub) {
       Procedure superProcedure = superTarget;
       superTarget = superProcedure.concreteForwardingStubTarget!;
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro.dart b/pkg/front_end/lib/src/fasta/kernel/macro.dart
index 8b331c0..1cd915d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro.dart
@@ -344,6 +344,7 @@
         isAbstract: builder.isAbstract,
         isExternal: builder.isExternal,
         isGetter: builder.isGetter,
+        isOperator: builder.isOperator,
         isSetter: builder.isSetter,
         positionalParameters: positionalParameters,
         namedParameters: namedParameters,
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 50fad75..4d8edad 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -952,24 +952,29 @@
       return;
     }
 
-    // Check whether [redirecteeType] <: [factoryType].
-    if (!typeEnvironment.isSubtypeOf(
-        redirecteeType, factoryType, SubtypeCheckMode.ignoringNullabilities)) {
-      _addProblemForRedirectingFactory(
-          factory,
-          templateIncompatibleRedirecteeFunctionType.withArguments(
-              redirecteeType, factoryType, library.isNonNullableByDefault),
-          factory.redirectionTarget.charOffset,
-          noLength);
-    } else if (library.isNonNullableByDefault) {
-      if (!typeEnvironment.isSubtypeOf(
-          redirecteeType, factoryType, SubtypeCheckMode.withNullabilities)) {
+    // Redirection to generative enum constructors is forbidden and is reported
+    // as an error elsewhere.
+    if (!(cls.isEnum &&
+        (factory.redirectionTarget.target?.isConstructor ?? false))) {
+      // Check whether [redirecteeType] <: [factoryType].
+      if (!typeEnvironment.isSubtypeOf(redirecteeType, factoryType,
+          SubtypeCheckMode.ignoringNullabilities)) {
         _addProblemForRedirectingFactory(
             factory,
             templateIncompatibleRedirecteeFunctionType.withArguments(
                 redirecteeType, factoryType, library.isNonNullableByDefault),
             factory.redirectionTarget.charOffset,
             noLength);
+      } else if (library.isNonNullableByDefault) {
+        if (!typeEnvironment.isSubtypeOf(
+            redirecteeType, factoryType, SubtypeCheckMode.withNullabilities)) {
+          _addProblemForRedirectingFactory(
+              factory,
+              templateIncompatibleRedirecteeFunctionType.withArguments(
+                  redirecteeType, factoryType, library.isNonNullableByDefault),
+              factory.redirectionTarget.charOffset,
+              noLength);
+        }
       }
     }
   }
@@ -1690,6 +1695,16 @@
                     noLength);
                 targetNode = null;
               }
+              if (targetNode != null &&
+                  targetNode is Constructor &&
+                  targetNode.enclosingClass.isEnum) {
+                _addProblemForRedirectingFactory(
+                    declaration,
+                    messageEnumFactoryRedirectsToConstructor,
+                    redirectionTarget.charOffset,
+                    noLength);
+                targetNode = null;
+              }
               if (targetNode != null) {
                 List<DartType> typeArguments = declaration.typeArguments ??
                     new List<DartType>.filled(
diff --git a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
index 8f7cfc8..27e2e0e 100644
--- a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
@@ -21,16 +21,17 @@
 import '../builder/type_variable_builder.dart';
 import '../constant_context.dart' show ConstantContext;
 import '../dill/dill_member_builder.dart';
+import '../identifiers.dart';
 import '../kernel/body_builder.dart' show BodyBuilder;
 import '../kernel/constructor_tearoff_lowering.dart';
-import '../kernel/expression_generator_helper.dart'
-    show ExpressionGeneratorHelper;
+import '../kernel/expression_generator_helper.dart';
 import '../kernel/hierarchy/class_member.dart' show ClassMember;
 import '../kernel/kernel_helper.dart' show SynthesizedFunctionNode;
 import '../kernel/utils.dart'
     show isRedirectingGenerativeConstructorImplementation;
 import '../messages.dart'
     show
+        LocatedMessage,
         Message,
         messageMoreThanOneSuperInitializer,
         messageRedirectingConstructorWithAnotherInitializer,
@@ -83,6 +84,12 @@
   @override
   List<FormalParameterBuilder>? formals;
 
+  @override
+  String get fullNameForErrors {
+    return "${flattenName(classBuilder.name, charOffset, fileUri)}"
+        "${name.isEmpty ? '' : '.$name'}";
+  }
+
   DeclaredSourceConstructorBuilder(
       List<MetadataBuilder>? metadata,
       int modifiers,
@@ -523,8 +530,27 @@
             helper);
       } else {
         inferenceResult?.applyResult(initializers, _constructor);
-        initializers.add(initializer..parent = _constructor);
         superInitializer = initializer;
+
+        LocatedMessage? message = helper.checkArgumentsForFunction(
+            initializer.target.function,
+            initializer.arguments,
+            initializer.arguments.fileOffset, <TypeParameter>[]);
+        if (message != null) {
+          initializers.add(helper.buildInvalidInitializer(
+              helper.buildUnresolvedError(
+                  helper.forest.createNullLiteral(initializer.fileOffset),
+                  helper.constructorNameForDiagnostics(
+                      initializer.target.name.text),
+                  initializer.arguments,
+                  initializer.fileOffset,
+                  isSuper: true,
+                  message: message,
+                  kind: UnresolvedKind.Constructor))
+            ..parent = _constructor);
+        } else {
+          initializers.add(initializer..parent = _constructor);
+        }
       }
     } else if (initializer is RedirectingInitializer) {
       if (superInitializer != null) {
@@ -559,8 +585,28 @@
         redirectingInitializer = initializer;
       } else {
         inferenceResult?.applyResult(initializers, _constructor);
-        initializers.add(initializer..parent = _constructor);
         redirectingInitializer = initializer;
+
+        LocatedMessage? message = helper.checkArgumentsForFunction(
+            initializer.target.function,
+            initializer.arguments,
+            initializer.arguments.fileOffset, const <TypeParameter>[]);
+        if (message != null) {
+          initializers.add(helper.buildInvalidInitializer(
+              helper.buildUnresolvedError(
+                  helper.forest.createNullLiteral(initializer.fileOffset),
+                  helper.constructorNameForDiagnostics(
+                      initializer.target.name.text,
+                      isSuper: false),
+                  initializer.arguments,
+                  initializer.fileOffset,
+                  isSuper: false,
+                  message: message,
+                  kind: UnresolvedKind.Constructor))
+            ..parent = _constructor);
+        } else {
+          initializers.add(initializer..parent = _constructor);
+        }
       }
     } else if (redirectingInitializer != null) {
       int length = noLength;
diff --git a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
index 093c77c..b6040af 100644
--- a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart
@@ -28,6 +28,7 @@
     show
         LocatedMessage,
         messageEnumEntryWithTypeArgumentsWithoutArguments,
+        messageEnumNonConstConstructor,
         messageNoUnnamedConstructorInObject,
         noLength,
         templateDuplicatedDeclaration,
@@ -36,6 +37,7 @@
         templateEnumConstantSameNameAsEnclosing;
 
 import '../kernel/body_builder.dart';
+import '../kernel/constness.dart';
 import '../kernel/constructor_tearoff_lowering.dart';
 import '../kernel/expression_generator_helper.dart';
 import '../kernel/kernel_helper.dart';
@@ -83,6 +85,7 @@
       this.objectType,
       this.stringType,
       SourceLibraryBuilder parent,
+      List<ConstructorReferenceBuilder> constructorReferences,
       int startCharOffset,
       int charOffset,
       int charEndOffset,
@@ -98,7 +101,7 @@
             scope,
             constructors,
             parent,
-            /* constructorReferences = */ null,
+            constructorReferences,
             startCharOffset,
             charOffset,
             charEndOffset,
@@ -113,6 +116,7 @@
       List<TypeBuilder>? interfaceBuilders,
       List<EnumConstantInfo?>? enumConstantInfos,
       SourceLibraryBuilder parent,
+      List<ConstructorReferenceBuilder> constructorReferences,
       int startCharOffset,
       int charOffset,
       int charEndOffset,
@@ -420,6 +424,7 @@
         objectType,
         stringType,
         parent,
+        constructorReferences,
         startCharOffsetComputed,
         charOffset,
         charEndOffset,
@@ -435,8 +440,18 @@
     }
 
     members.forEach(setParent);
-    constructors.forEach(setParent);
+    constructorScope.local.forEach(setParent);
     selfType.bind(enumBuilder);
+
+    if (constructorScope.local.isNotEmpty) {
+      for (MemberBuilder constructorBuilder in constructorScope.local.values) {
+        if (!constructorBuilder.isFactory && !constructorBuilder.isConst) {
+          parent.addProblem(messageEnumNonConstConstructor,
+              constructorBuilder.charOffset, noLength, fileUri);
+        }
+      }
+    }
+
     return enumBuilder;
   }
 
@@ -590,12 +605,13 @@
             }
           }
           BodyBuilder? bodyBuilder;
-          if (enumConstantInfo.argumentsBeginToken != null ||
-              typeArgumentBuilders == null && cls.typeParameters.isNotEmpty) {
-            // We need to create a BodyBuilder in two cases: 1) if the
-            // arguments token is provided, we'll use the BodyBuilder to
+          if (libraryBuilder.enableEnhancedEnumsInLibrary) {
+            // We need to create a BodyBuilder to solve the following: 1) if
+            // the arguments token is provided, we'll use the BodyBuilder to
             // parse them and perform inference, 2) if the type arguments
-            // aren't provided, but required, we'll use it to infer them.
+            // aren't provided, but required, we'll use it to infer them, and
+            // 3) in case of erroneous code the constructor invocation should
+            // be built via a body builder to detect potential errors.
             bodyBuilder = library.loader.createBodyBuilderForOutlineExpression(
                 library, this, this, scope, fileUri);
             bodyBuilder.constantContext = ConstantContext.required;
@@ -622,13 +638,9 @@
 
           if (constructorBuilder == null ||
               constructorBuilder is! SourceConstructorBuilder) {
-            bodyBuilder ??= library.loader
-                .createBodyBuilderForOutlineExpression(
-                    library, this, this, scope, fileUri)
-              ..constantContext = ConstantContext.required;
             field.buildBody(
                 classHierarchy.coreTypes,
-                bodyBuilder.buildUnresolvedError(
+                bodyBuilder!.buildUnresolvedError(
                     new NullLiteral(),
                     enumConstantInfo
                             .constructorReferenceBuilder?.fullNameForErrors ??
@@ -638,16 +650,23 @@
                         enumConstantInfo.charOffset,
                     kind: UnresolvedKind.Constructor));
           } else {
-            Expression initializer = new ConstructorInvocation(
-                constructorBuilder.constructor, arguments,
-                isConst: true)
-              ..fileOffset = field.charOffset;
+            Expression initializer;
             if (bodyBuilder != null) {
+              initializer = bodyBuilder.buildStaticInvocation(
+                  constructorBuilder.constructor, arguments,
+                  constness: Constness.explicitConst,
+                  charOffset: field.charOffset);
               ExpressionInferenceResult inferenceResult =
                   bodyBuilder.typeInferrer.inferFieldInitializer(
                       bodyBuilder, const UnknownType(), initializer);
               initializer = inferenceResult.expression;
+              if (initializer is ConstructorInvocation) {}
               field.fieldType = inferenceResult.inferredType;
+            } else {
+              initializer = new ConstructorInvocation(
+                  constructorBuilder.constructor, arguments,
+                  isConst: true)
+                ..fileOffset = field.charOffset;
             }
             field.buildBody(classHierarchy.coreTypes, initializer);
           }
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index a0bf299..dee61c4 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -2820,6 +2820,7 @@
         interfaceBuilders,
         enumConstantInfos,
         this,
+        new List<ConstructorReferenceBuilder>.of(constructorReferences),
         startCharOffset,
         charOffset,
         charEndOffset,
@@ -2831,6 +2832,7 @@
             debugName: "enum $name",
             isModifiable: false),
         new ConstructorScope(name, constructors));
+    constructorReferences.clear();
 
     Map<String, TypeVariableBuilder>? typeVariablesByName =
         checkTypeVariables(typeVariables, enumBuilder);
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 74da302..7be3d9c 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -213,13 +213,21 @@
 DuplicatedParameterName/example: Fail
 Encoding/analyzerCode: Fail
 EnumConstantSameNameAsEnclosing/example: Fail
+EnumConstructorSuperInitializer/analyzerCode: Fail
+EnumConstructorSuperInitializer/example: Fail
+EnumConstructorTearoff/analyzerCode: Fail
+EnumConstructorTearoff/example: Fail
 EnumDeclaresConstFactory/analyzerCode: Fail
 EnumDeclaresConstFactory/example: Fail
 EnumDeclaresFactory/analyzerCode: Fail
 EnumDeclaresFactory/example: Fail
 EnumEntryWithTypeArgumentsWithoutArguments/analyzerCode: Fail
 EnumEntryWithTypeArgumentsWithoutArguments/example: Fail
+EnumFactoryRedirectsToConstructor/analyzerCode: Fail
+EnumFactoryRedirectsToConstructor/example: Fail
 EnumInstantiation/example: Fail
+EnumNonConstConstructor/analyzerCode: Fail
+EnumNonConstConstructor/example: Fail
 EnumSupertypeOfNonAbstractClass/analyzerCode: Fail
 EnumSupertypeOfNonAbstractClass/example: Fail
 EqualityCannotBeEqualityOperand/part_wrapped_script1: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 67467be..5fdadc6 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -5461,3 +5461,15 @@
 
 EnumEntryWithTypeArgumentsWithoutArguments:
   problemMessage: "Missing arguments in enum constructor invocation."
+
+EnumNonConstConstructor:
+  problemMessage: "Generative enum constructors must be marked as 'const'."
+
+EnumConstructorSuperInitializer:
+  problemMessage: "Enum constructors can't contain super-initializers."
+
+EnumConstructorTearoff:
+  problemMessage: "Enum constructors can't be torn off."
+
+EnumFactoryRedirectsToConstructor:
+  problemMessage: "Enum factory constructors can't redirect to generative constructors."
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart
new file mode 100644
index 0000000..e92c5b9
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart
@@ -0,0 +1,13 @@
+void main() {
+  try {
+    ;
+  } catch (e) {
+    ;
+  } on Foo {
+    ;
+  }
+
+  on();
+}
+
+void on() {}
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.expect
new file mode 100644
index 0000000..0914f09
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.expect
@@ -0,0 +1,65 @@
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null)
+      handleVoidKeyword(void)
+      handleIdentifier(main, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginTryStatement(try)
+          beginBlock({, BlockKind(try statement))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(try statement))
+          beginCatchClause(catch)
+            beginFormalParameters((, MemberKind.Catch)
+              beginMetadataStar(e)
+              endMetadataStar(0)
+              beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                handleNoType(()
+                handleIdentifier(e, formalParameterDeclaration)
+                handleFormalParameterWithoutValue())
+              endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+            endFormalParameters(1, (, ), MemberKind.Catch)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(null, catch, null)
+          beginCatchClause(on)
+            handleIdentifier(Foo, typeReference)
+            handleNoTypeArguments({)
+            handleType(Foo, null)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(on, null, null)
+        endTryStatement(2, try, null)
+        handleIdentifier(on, expression)
+        handleNoTypeArguments(()
+        beginArguments(()
+        endArguments(0, (, ))
+        handleSend(on, ;)
+        handleExpressionStatement(;)
+      endBlockFunctionBody(2, {, })
+    endTopLevelMethod(void, null, })
+  endTopLevelDeclaration(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(}, null)
+      handleVoidKeyword(void)
+      handleIdentifier(on, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+      endBlockFunctionBody(0, {, })
+    endTopLevelMethod(void, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.intertwined.expect
new file mode 100644
index 0000000..978a69c
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.intertwined.expect
@@ -0,0 +1,147 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+        listener: beginTopLevelMethod(, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, try)
+          parseStatement({)
+            parseStatementX({)
+              parseTryStatement({)
+                listener: beginTryStatement(try)
+                parseBlock(try, BlockKind(try statement))
+                  ensureBlock(try, null, try statement)
+                  listener: beginBlock({, BlockKind(try statement))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(try statement))
+                listener: beginCatchClause(catch)
+                parseFormalParameters(catch, MemberKind.Catch)
+                  parseFormalParametersRest((, MemberKind.Catch)
+                    listener: beginFormalParameters((, MemberKind.Catch)
+                    parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+                      parseMetadataStar(()
+                        listener: beginMetadataStar(e)
+                        listener: endMetadataStar(0)
+                      listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                      listener: handleNoType(()
+                      ensureIdentifier((, formalParameterDeclaration)
+                        listener: handleIdentifier(e, formalParameterDeclaration)
+                      listener: handleFormalParameterWithoutValue())
+                      listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+                    listener: endFormalParameters(1, (, ), MemberKind.Catch)
+                listener: endCatchClause({)
+                parseBlock(), BlockKind(catch clause))
+                  ensureBlock(), null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(null, catch, null)
+                listener: beginCatchClause(on)
+                listener: handleIdentifier(Foo, typeReference)
+                listener: handleNoTypeArguments({)
+                listener: handleType(Foo, null)
+                listener: endCatchClause({)
+                parseBlock(Foo, BlockKind(catch clause))
+                  ensureBlock(Foo, null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(on, null, null)
+                listener: endTryStatement(2, try, null)
+          notEofOrValue(}, on)
+          parseStatement(})
+            parseStatementX(})
+              parseExpressionStatementOrDeclaration(}, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+                  looksLikeLocalFunction(on)
+                  parseExpressionStatement(})
+                    parseExpression(})
+                      parsePrecedenceExpression(}, 1, true)
+                        parseUnaryExpression(}, true)
+                          parsePrimary(}, expression)
+                            inPlainSync()
+                            parseSendOrFunctionLiteral(}, expression)
+                              looksLikeFunctionBody(;)
+                              parseSend(}, expression)
+                                isNextIdentifier(})
+                                ensureIdentifier(}, expression)
+                                  inPlainSync()
+                                  listener: handleIdentifier(on, expression)
+                                listener: handleNoTypeArguments(()
+                                parseArgumentsOpt(on)
+                                  parseArguments(on)
+                                    parseArgumentsRest(()
+                                      listener: beginArguments(()
+                                      listener: endArguments(0, (, ))
+                                listener: handleSend(on, ;)
+                    ensureSemicolon())
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(2, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration(void)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(})
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(}, null, }, Instance of 'VoidType', null, on, false)
+        listener: beginTopLevelMethod(}, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(on, topLevelFunctionDeclaration)
+        parseMethodTypeVar(on)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(on, on, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(on, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(0, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.parser.expect
new file mode 100644
index 0000000..ae4a8fa
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.parser.expect
@@ -0,0 +1,29 @@
+void main() {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+
+on();
+}
+
+void on() {}
+
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+
+on[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+void[KeywordToken] on[KeywordToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.scanner.expect
new file mode 100644
index 0000000..ae4a8fa
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block.dart.scanner.expect
@@ -0,0 +1,29 @@
+void main() {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+
+on();
+}
+
+void on() {}
+
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+
+on[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+void[KeywordToken] on[KeywordToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block.equivalence_info b/pkg/front_end/parser_testcases/general/call_on_after_try_block.equivalence_info
new file mode 100644
index 0000000..7e10e9d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block.equivalence_info
@@ -0,0 +1,5 @@
+files:
+  - call_on_after_try_block.dart
+  - call_on_after_try_block_prime.dart
+filters:
+  - ignoreListenerArguments
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart
new file mode 100644
index 0000000..1809732
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart
@@ -0,0 +1,15 @@
+void main() {
+  try {
+    ;
+  } catch (e) {
+    ;
+  } on Foo {
+    ;
+  }
+
+  on(e) {
+    ;
+  }
+  on("");
+}
+
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.expect
new file mode 100644
index 0000000..6cd22a5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.expect
@@ -0,0 +1,76 @@
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null)
+      handleVoidKeyword(void)
+      handleIdentifier(main, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginTryStatement(try)
+          beginBlock({, BlockKind(try statement))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(try statement))
+          beginCatchClause(catch)
+            beginFormalParameters((, MemberKind.Catch)
+              beginMetadataStar(e)
+              endMetadataStar(0)
+              beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                handleNoType(()
+                handleIdentifier(e, formalParameterDeclaration)
+                handleFormalParameterWithoutValue())
+              endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+            endFormalParameters(1, (, ), MemberKind.Catch)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(null, catch, null)
+          beginCatchClause(on)
+            handleIdentifier(Foo, typeReference)
+            handleNoTypeArguments({)
+            handleType(Foo, null)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(on, null, null)
+        endTryStatement(2, try, null)
+        beginMetadataStar(on)
+        endMetadataStar(0)
+        handleNoTypeVariables(()
+        beginLocalFunctionDeclaration(on)
+          handleNoType(})
+          beginFunctionName(on)
+            handleIdentifier(on, localFunctionDeclaration)
+          endFunctionName(on, ()
+          beginFormalParameters((, MemberKind.Local)
+            beginMetadataStar(e)
+            endMetadataStar(0)
+            beginFormalParameter(e, MemberKind.Local, null, null, null)
+              handleNoType(()
+              handleIdentifier(e, formalParameterDeclaration)
+              handleFormalParameterWithoutValue())
+            endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+          endFormalParameters(1, (, ), MemberKind.Local)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          beginBlockFunctionBody({)
+            handleEmptyStatement(;)
+          endBlockFunctionBody(1, {, })
+        endLocalFunctionDeclaration(})
+        handleIdentifier(on, expression)
+        handleNoTypeArguments(()
+        beginArguments(()
+          beginLiteralString("")
+          endLiteralString(0, ))
+        endArguments(1, (, ))
+        handleSend(on, ;)
+        handleExpressionStatement(;)
+      endBlockFunctionBody(3, {, })
+    endTopLevelMethod(void, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.intertwined.expect
new file mode 100644
index 0000000..c86c3bb
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.intertwined.expect
@@ -0,0 +1,175 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+        listener: beginTopLevelMethod(, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, try)
+          parseStatement({)
+            parseStatementX({)
+              parseTryStatement({)
+                listener: beginTryStatement(try)
+                parseBlock(try, BlockKind(try statement))
+                  ensureBlock(try, null, try statement)
+                  listener: beginBlock({, BlockKind(try statement))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(try statement))
+                listener: beginCatchClause(catch)
+                parseFormalParameters(catch, MemberKind.Catch)
+                  parseFormalParametersRest((, MemberKind.Catch)
+                    listener: beginFormalParameters((, MemberKind.Catch)
+                    parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+                      parseMetadataStar(()
+                        listener: beginMetadataStar(e)
+                        listener: endMetadataStar(0)
+                      listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                      listener: handleNoType(()
+                      ensureIdentifier((, formalParameterDeclaration)
+                        listener: handleIdentifier(e, formalParameterDeclaration)
+                      listener: handleFormalParameterWithoutValue())
+                      listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+                    listener: endFormalParameters(1, (, ), MemberKind.Catch)
+                listener: endCatchClause({)
+                parseBlock(), BlockKind(catch clause))
+                  ensureBlock(), null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(null, catch, null)
+                listener: beginCatchClause(on)
+                listener: handleIdentifier(Foo, typeReference)
+                listener: handleNoTypeArguments({)
+                listener: handleType(Foo, null)
+                listener: endCatchClause({)
+                parseBlock(Foo, BlockKind(catch clause))
+                  ensureBlock(Foo, null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(on, null, null)
+                listener: endTryStatement(2, try, null)
+          notEofOrValue(}, on)
+          parseStatement(})
+            parseStatementX(})
+              parseExpressionStatementOrDeclaration(}, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+                  looksLikeLocalFunction(on)
+                  listener: beginMetadataStar(on)
+                  listener: endMetadataStar(0)
+                  listener: handleNoTypeVariables(()
+                  listener: beginLocalFunctionDeclaration(on)
+                  listener: handleNoType(})
+                  parseNamedFunctionRest(}, on, on, false)
+                    listener: beginFunctionName(on)
+                    ensureIdentifier(}, localFunctionDeclaration)
+                      inPlainSync()
+                      listener: handleIdentifier(on, localFunctionDeclaration)
+                    listener: endFunctionName(on, ()
+                    parseFormalParametersRequiredOpt(on, MemberKind.Local)
+                      parseFormalParametersRest((, MemberKind.Local)
+                        listener: beginFormalParameters((, MemberKind.Local)
+                        parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Local)
+                          parseMetadataStar(()
+                            listener: beginMetadataStar(e)
+                            listener: endMetadataStar(0)
+                          listener: beginFormalParameter(e, MemberKind.Local, null, null, null)
+                          listener: handleNoType(()
+                          ensureIdentifier((, formalParameterDeclaration)
+                            listener: handleIdentifier(e, formalParameterDeclaration)
+                          listener: handleFormalParameterWithoutValue())
+                          listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+                        listener: endFormalParameters(1, (, ), MemberKind.Local)
+                    parseInitializersOpt())
+                      listener: handleNoInitializers()
+                    parseAsyncOptBody(), false, false)
+                      parseAsyncModifierOpt())
+                        listener: handleAsyncModifier(null, null)
+                        inPlainSync()
+                      parseFunctionBody(), false, false)
+                        listener: beginBlockFunctionBody({)
+                        notEofOrValue(}, ;)
+                        parseStatement({)
+                          parseStatementX({)
+                            parseEmptyStatement({)
+                              listener: handleEmptyStatement(;)
+                        notEofOrValue(}, })
+                        listener: endBlockFunctionBody(1, {, })
+                    listener: endLocalFunctionDeclaration(})
+          notEofOrValue(}, on)
+          parseStatement(})
+            parseStatementX(})
+              parseExpressionStatementOrDeclaration(}, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+                  looksLikeLocalFunction(on)
+                  parseExpressionStatement(})
+                    parseExpression(})
+                      parsePrecedenceExpression(}, 1, true)
+                        parseUnaryExpression(}, true)
+                          parsePrimary(}, expression)
+                            inPlainSync()
+                            parseSendOrFunctionLiteral(}, expression)
+                              looksLikeFunctionBody(;)
+                              parseSend(}, expression)
+                                isNextIdentifier(})
+                                ensureIdentifier(}, expression)
+                                  inPlainSync()
+                                  listener: handleIdentifier(on, expression)
+                                listener: handleNoTypeArguments(()
+                                parseArgumentsOpt(on)
+                                  parseArguments(on)
+                                    parseArgumentsRest(()
+                                      listener: beginArguments(()
+                                      parseExpression(()
+                                        parsePrecedenceExpression((, 1, true)
+                                          parseUnaryExpression((, true)
+                                            parsePrimary((, expression)
+                                              parseLiteralString(()
+                                                parseSingleLiteralString(()
+                                                  listener: beginLiteralString("")
+                                                  listener: endLiteralString(0, ))
+                                      listener: endArguments(1, (, ))
+                                listener: handleSend(on, ;)
+                    ensureSemicolon())
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(3, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.parser.expect
new file mode 100644
index 0000000..0966333
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.parser.expect
@@ -0,0 +1,33 @@
+void main() {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+
+on(e) {
+;
+}
+on("");
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+
+on[KeywordToken]([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+on[KeywordToken]([BeginToken]""[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.scanner.expect
new file mode 100644
index 0000000..0966333
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.dart.scanner.expect
@@ -0,0 +1,33 @@
+void main() {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+
+on(e) {
+;
+}
+on("");
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+
+on[KeywordToken]([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+on[KeywordToken]([BeginToken]""[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2.equivalence_info b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.equivalence_info
new file mode 100644
index 0000000..66ae9f7
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2.equivalence_info
@@ -0,0 +1,5 @@
+files:
+  - call_on_after_try_block2.dart
+  - call_on_after_try_block2_prime.dart
+filters:
+  - ignoreListenerArguments
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart
new file mode 100644
index 0000000..6545ea2
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart
@@ -0,0 +1,15 @@
+void main() {
+  try {
+    ;
+  } catch (e) {
+    ;
+  } on Foo {
+    ;
+  }
+
+  onX(e) {
+    ;
+  }
+  onX("");
+}
+
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.expect
new file mode 100644
index 0000000..42b2c0f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.expect
@@ -0,0 +1,76 @@
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null)
+      handleVoidKeyword(void)
+      handleIdentifier(main, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginTryStatement(try)
+          beginBlock({, BlockKind(try statement))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(try statement))
+          beginCatchClause(catch)
+            beginFormalParameters((, MemberKind.Catch)
+              beginMetadataStar(e)
+              endMetadataStar(0)
+              beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                handleNoType(()
+                handleIdentifier(e, formalParameterDeclaration)
+                handleFormalParameterWithoutValue())
+              endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+            endFormalParameters(1, (, ), MemberKind.Catch)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(null, catch, null)
+          beginCatchClause(on)
+            handleIdentifier(Foo, typeReference)
+            handleNoTypeArguments({)
+            handleType(Foo, null)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(on, null, null)
+        endTryStatement(2, try, null)
+        beginMetadataStar(onX)
+        endMetadataStar(0)
+        handleNoTypeVariables(()
+        beginLocalFunctionDeclaration(onX)
+          handleNoType(})
+          beginFunctionName(onX)
+            handleIdentifier(onX, localFunctionDeclaration)
+          endFunctionName(onX, ()
+          beginFormalParameters((, MemberKind.Local)
+            beginMetadataStar(e)
+            endMetadataStar(0)
+            beginFormalParameter(e, MemberKind.Local, null, null, null)
+              handleNoType(()
+              handleIdentifier(e, formalParameterDeclaration)
+              handleFormalParameterWithoutValue())
+            endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+          endFormalParameters(1, (, ), MemberKind.Local)
+          handleNoInitializers()
+          handleAsyncModifier(null, null)
+          beginBlockFunctionBody({)
+            handleEmptyStatement(;)
+          endBlockFunctionBody(1, {, })
+        endLocalFunctionDeclaration(})
+        handleIdentifier(onX, expression)
+        handleNoTypeArguments(()
+        beginArguments(()
+          beginLiteralString("")
+          endLiteralString(0, ))
+        endArguments(1, (, ))
+        handleSend(onX, ;)
+        handleExpressionStatement(;)
+      endBlockFunctionBody(3, {, })
+    endTopLevelMethod(void, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.intertwined.expect
new file mode 100644
index 0000000..1f1b263
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.intertwined.expect
@@ -0,0 +1,170 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+        listener: beginTopLevelMethod(, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, try)
+          parseStatement({)
+            parseStatementX({)
+              parseTryStatement({)
+                listener: beginTryStatement(try)
+                parseBlock(try, BlockKind(try statement))
+                  ensureBlock(try, null, try statement)
+                  listener: beginBlock({, BlockKind(try statement))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(try statement))
+                listener: beginCatchClause(catch)
+                parseFormalParameters(catch, MemberKind.Catch)
+                  parseFormalParametersRest((, MemberKind.Catch)
+                    listener: beginFormalParameters((, MemberKind.Catch)
+                    parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+                      parseMetadataStar(()
+                        listener: beginMetadataStar(e)
+                        listener: endMetadataStar(0)
+                      listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                      listener: handleNoType(()
+                      ensureIdentifier((, formalParameterDeclaration)
+                        listener: handleIdentifier(e, formalParameterDeclaration)
+                      listener: handleFormalParameterWithoutValue())
+                      listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+                    listener: endFormalParameters(1, (, ), MemberKind.Catch)
+                listener: endCatchClause({)
+                parseBlock(), BlockKind(catch clause))
+                  ensureBlock(), null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(null, catch, null)
+                listener: beginCatchClause(on)
+                listener: handleIdentifier(Foo, typeReference)
+                listener: handleNoTypeArguments({)
+                listener: handleType(Foo, null)
+                listener: endCatchClause({)
+                parseBlock(Foo, BlockKind(catch clause))
+                  ensureBlock(Foo, null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(on, null, null)
+                listener: endTryStatement(2, try, null)
+          notEofOrValue(}, onX)
+          parseStatement(})
+            parseStatementX(})
+              parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+                looksLikeLocalFunction(onX)
+                listener: beginMetadataStar(onX)
+                listener: endMetadataStar(0)
+                listener: handleNoTypeVariables(()
+                listener: beginLocalFunctionDeclaration(onX)
+                listener: handleNoType(})
+                parseNamedFunctionRest(}, onX, onX, false)
+                  listener: beginFunctionName(onX)
+                  ensureIdentifier(}, localFunctionDeclaration)
+                    listener: handleIdentifier(onX, localFunctionDeclaration)
+                  listener: endFunctionName(onX, ()
+                  parseFormalParametersRequiredOpt(onX, MemberKind.Local)
+                    parseFormalParametersRest((, MemberKind.Local)
+                      listener: beginFormalParameters((, MemberKind.Local)
+                      parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Local)
+                        parseMetadataStar(()
+                          listener: beginMetadataStar(e)
+                          listener: endMetadataStar(0)
+                        listener: beginFormalParameter(e, MemberKind.Local, null, null, null)
+                        listener: handleNoType(()
+                        ensureIdentifier((, formalParameterDeclaration)
+                          listener: handleIdentifier(e, formalParameterDeclaration)
+                        listener: handleFormalParameterWithoutValue())
+                        listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Local)
+                      listener: endFormalParameters(1, (, ), MemberKind.Local)
+                  parseInitializersOpt())
+                    listener: handleNoInitializers()
+                  parseAsyncOptBody(), false, false)
+                    parseAsyncModifierOpt())
+                      listener: handleAsyncModifier(null, null)
+                      inPlainSync()
+                    parseFunctionBody(), false, false)
+                      listener: beginBlockFunctionBody({)
+                      notEofOrValue(}, ;)
+                      parseStatement({)
+                        parseStatementX({)
+                          parseEmptyStatement({)
+                            listener: handleEmptyStatement(;)
+                      notEofOrValue(}, })
+                      listener: endBlockFunctionBody(1, {, })
+                  listener: endLocalFunctionDeclaration(})
+          notEofOrValue(}, onX)
+          parseStatement(})
+            parseStatementX(})
+              parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+                looksLikeLocalFunction(onX)
+                parseExpressionStatement(})
+                  parseExpression(})
+                    parsePrecedenceExpression(}, 1, true)
+                      parseUnaryExpression(}, true)
+                        parsePrimary(}, expression)
+                          parseSendOrFunctionLiteral(}, expression)
+                            looksLikeFunctionBody(;)
+                            parseSend(}, expression)
+                              isNextIdentifier(})
+                              ensureIdentifier(}, expression)
+                                listener: handleIdentifier(onX, expression)
+                              listener: handleNoTypeArguments(()
+                              parseArgumentsOpt(onX)
+                                parseArguments(onX)
+                                  parseArgumentsRest(()
+                                    listener: beginArguments(()
+                                    parseExpression(()
+                                      parsePrecedenceExpression((, 1, true)
+                                        parseUnaryExpression((, true)
+                                          parsePrimary((, expression)
+                                            parseLiteralString(()
+                                              parseSingleLiteralString(()
+                                                listener: beginLiteralString("")
+                                                listener: endLiteralString(0, ))
+                                    listener: endArguments(1, (, ))
+                              listener: handleSend(onX, ;)
+                  ensureSemicolon())
+                  listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(3, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.parser.expect
new file mode 100644
index 0000000..d3fb703
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.parser.expect
@@ -0,0 +1,33 @@
+void main() {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+
+onX(e) {
+;
+}
+onX("");
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+
+onX[StringToken]([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+onX[StringToken]([BeginToken]""[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.scanner.expect
new file mode 100644
index 0000000..d3fb703
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block2_prime.dart.scanner.expect
@@ -0,0 +1,33 @@
+void main() {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+
+onX(e) {
+;
+}
+onX("");
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+
+onX[StringToken]([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+onX[StringToken]([BeginToken]""[StringToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart
new file mode 100644
index 0000000..802f69e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart
@@ -0,0 +1,11 @@
+void main(int on) {
+  try {
+    ;
+  } catch (e) {
+    ;
+  } on Foo {
+    ;
+  }
+  on.toString();
+}
+
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.expect
new file mode 100644
index 0000000..b7e4845
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.expect
@@ -0,0 +1,65 @@
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null)
+      handleVoidKeyword(void)
+      handleIdentifier(main, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(on)
+          handleType(int, null)
+          handleIdentifier(on, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginTryStatement(try)
+          beginBlock({, BlockKind(try statement))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(try statement))
+          beginCatchClause(catch)
+            beginFormalParameters((, MemberKind.Catch)
+              beginMetadataStar(e)
+              endMetadataStar(0)
+              beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                handleNoType(()
+                handleIdentifier(e, formalParameterDeclaration)
+                handleFormalParameterWithoutValue())
+              endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+            endFormalParameters(1, (, ), MemberKind.Catch)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(null, catch, null)
+          beginCatchClause(on)
+            handleIdentifier(Foo, typeReference)
+            handleNoTypeArguments({)
+            handleType(Foo, null)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(on, null, null)
+        endTryStatement(2, try, null)
+        handleIdentifier(on, expression)
+        handleNoTypeArguments(.)
+        handleNoArguments(.)
+        handleSend(on, .)
+        handleIdentifier(toString, expressionContinuation)
+        handleNoTypeArguments(()
+        beginArguments(()
+        endArguments(0, (, ))
+        handleSend(toString, ;)
+        handleEndingBinaryExpression(.)
+        handleExpressionStatement(;)
+      endBlockFunctionBody(2, {, })
+    endTopLevelMethod(void, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.intertwined.expect
new file mode 100644
index 0000000..a976a69
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.intertwined.expect
@@ -0,0 +1,144 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+        listener: beginTopLevelMethod(, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(on)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  inPlainSync()
+                  listener: handleIdentifier(on, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, try)
+          parseStatement({)
+            parseStatementX({)
+              parseTryStatement({)
+                listener: beginTryStatement(try)
+                parseBlock(try, BlockKind(try statement))
+                  ensureBlock(try, null, try statement)
+                  listener: beginBlock({, BlockKind(try statement))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(try statement))
+                listener: beginCatchClause(catch)
+                parseFormalParameters(catch, MemberKind.Catch)
+                  parseFormalParametersRest((, MemberKind.Catch)
+                    listener: beginFormalParameters((, MemberKind.Catch)
+                    parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+                      parseMetadataStar(()
+                        listener: beginMetadataStar(e)
+                        listener: endMetadataStar(0)
+                      listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                      listener: handleNoType(()
+                      ensureIdentifier((, formalParameterDeclaration)
+                        listener: handleIdentifier(e, formalParameterDeclaration)
+                      listener: handleFormalParameterWithoutValue())
+                      listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+                    listener: endFormalParameters(1, (, ), MemberKind.Catch)
+                listener: endCatchClause({)
+                parseBlock(), BlockKind(catch clause))
+                  ensureBlock(), null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(null, catch, null)
+                listener: beginCatchClause(on)
+                listener: handleIdentifier(Foo, typeReference)
+                listener: handleNoTypeArguments({)
+                listener: handleType(Foo, null)
+                listener: endCatchClause({)
+                parseBlock(Foo, BlockKind(catch clause))
+                  ensureBlock(Foo, null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(on, null, null)
+                listener: endTryStatement(2, try, null)
+          notEofOrValue(}, on)
+          parseStatement(})
+            parseStatementX(})
+              parseExpressionStatementOrDeclaration(}, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+                  looksLikeLocalFunction(on)
+                  parseExpressionStatement(})
+                    parseExpression(})
+                      parsePrecedenceExpression(}, 1, true)
+                        parseUnaryExpression(}, true)
+                          parsePrimary(}, expression)
+                            inPlainSync()
+                            parseSendOrFunctionLiteral(}, expression)
+                              parseSend(}, expression)
+                                isNextIdentifier(})
+                                ensureIdentifier(}, expression)
+                                  inPlainSync()
+                                  listener: handleIdentifier(on, expression)
+                                listener: handleNoTypeArguments(.)
+                                parseArgumentsOpt(on)
+                                  listener: handleNoArguments(.)
+                                listener: handleSend(on, .)
+                        parsePrimary(., expressionContinuation)
+                          parseSendOrFunctionLiteral(., expressionContinuation)
+                            looksLikeFunctionBody(;)
+                            parseSend(., expressionContinuation)
+                              isNextIdentifier(.)
+                              ensureIdentifier(., expressionContinuation)
+                                listener: handleIdentifier(toString, expressionContinuation)
+                              listener: handleNoTypeArguments(()
+                              parseArgumentsOpt(toString)
+                                parseArguments(toString)
+                                  parseArgumentsRest(()
+                                    listener: beginArguments(()
+                                    listener: endArguments(0, (, ))
+                              listener: handleSend(toString, ;)
+                        listener: handleEndingBinaryExpression(.)
+                    ensureSemicolon())
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(2, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.parser.expect
new file mode 100644
index 0000000..3b86aa5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.parser.expect
@@ -0,0 +1,25 @@
+void main(int on) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+on.toString();
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] on[KeywordToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+on[KeywordToken].[SimpleToken]toString[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.scanner.expect
new file mode 100644
index 0000000..3b86aa5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.dart.scanner.expect
@@ -0,0 +1,25 @@
+void main(int on) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+on.toString();
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] on[KeywordToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+on[KeywordToken].[SimpleToken]toString[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3.equivalence_info b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.equivalence_info
new file mode 100644
index 0000000..313a263
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3.equivalence_info
@@ -0,0 +1,5 @@
+files:
+  - call_on_after_try_block3.dart
+  - call_on_after_try_block3_prime.dart
+filters:
+  - ignoreListenerArguments
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart
new file mode 100644
index 0000000..d01b2e8
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart
@@ -0,0 +1,11 @@
+void main(int onX) {
+  try {
+    ;
+  } catch (e) {
+    ;
+  } on Foo {
+    ;
+  }
+  onX.toString();
+}
+
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.expect
new file mode 100644
index 0000000..c26e870
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.expect
@@ -0,0 +1,65 @@
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null)
+      handleVoidKeyword(void)
+      handleIdentifier(main, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(onX)
+          handleType(int, null)
+          handleIdentifier(onX, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginTryStatement(try)
+          beginBlock({, BlockKind(try statement))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(try statement))
+          beginCatchClause(catch)
+            beginFormalParameters((, MemberKind.Catch)
+              beginMetadataStar(e)
+              endMetadataStar(0)
+              beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                handleNoType(()
+                handleIdentifier(e, formalParameterDeclaration)
+                handleFormalParameterWithoutValue())
+              endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+            endFormalParameters(1, (, ), MemberKind.Catch)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(null, catch, null)
+          beginCatchClause(on)
+            handleIdentifier(Foo, typeReference)
+            handleNoTypeArguments({)
+            handleType(Foo, null)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(on, null, null)
+        endTryStatement(2, try, null)
+        handleIdentifier(onX, expression)
+        handleNoTypeArguments(.)
+        handleNoArguments(.)
+        handleSend(onX, .)
+        handleIdentifier(toString, expressionContinuation)
+        handleNoTypeArguments(()
+        beginArguments(()
+        endArguments(0, (, ))
+        handleSend(toString, ;)
+        handleEndingBinaryExpression(.)
+        handleExpressionStatement(;)
+      endBlockFunctionBody(2, {, })
+    endTopLevelMethod(void, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.intertwined.expect
new file mode 100644
index 0000000..cf7a142
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.intertwined.expect
@@ -0,0 +1,140 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+        listener: beginTopLevelMethod(, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(onX)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(onX, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, try)
+          parseStatement({)
+            parseStatementX({)
+              parseTryStatement({)
+                listener: beginTryStatement(try)
+                parseBlock(try, BlockKind(try statement))
+                  ensureBlock(try, null, try statement)
+                  listener: beginBlock({, BlockKind(try statement))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(try statement))
+                listener: beginCatchClause(catch)
+                parseFormalParameters(catch, MemberKind.Catch)
+                  parseFormalParametersRest((, MemberKind.Catch)
+                    listener: beginFormalParameters((, MemberKind.Catch)
+                    parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+                      parseMetadataStar(()
+                        listener: beginMetadataStar(e)
+                        listener: endMetadataStar(0)
+                      listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                      listener: handleNoType(()
+                      ensureIdentifier((, formalParameterDeclaration)
+                        listener: handleIdentifier(e, formalParameterDeclaration)
+                      listener: handleFormalParameterWithoutValue())
+                      listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+                    listener: endFormalParameters(1, (, ), MemberKind.Catch)
+                listener: endCatchClause({)
+                parseBlock(), BlockKind(catch clause))
+                  ensureBlock(), null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(null, catch, null)
+                listener: beginCatchClause(on)
+                listener: handleIdentifier(Foo, typeReference)
+                listener: handleNoTypeArguments({)
+                listener: handleType(Foo, null)
+                listener: endCatchClause({)
+                parseBlock(Foo, BlockKind(catch clause))
+                  ensureBlock(Foo, null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(on, null, null)
+                listener: endTryStatement(2, try, null)
+          notEofOrValue(}, onX)
+          parseStatement(})
+            parseStatementX(})
+              parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+                looksLikeLocalFunction(onX)
+                parseExpressionStatement(})
+                  parseExpression(})
+                    parsePrecedenceExpression(}, 1, true)
+                      parseUnaryExpression(}, true)
+                        parsePrimary(}, expression)
+                          parseSendOrFunctionLiteral(}, expression)
+                            parseSend(}, expression)
+                              isNextIdentifier(})
+                              ensureIdentifier(}, expression)
+                                listener: handleIdentifier(onX, expression)
+                              listener: handleNoTypeArguments(.)
+                              parseArgumentsOpt(onX)
+                                listener: handleNoArguments(.)
+                              listener: handleSend(onX, .)
+                      parsePrimary(., expressionContinuation)
+                        parseSendOrFunctionLiteral(., expressionContinuation)
+                          looksLikeFunctionBody(;)
+                          parseSend(., expressionContinuation)
+                            isNextIdentifier(.)
+                            ensureIdentifier(., expressionContinuation)
+                              listener: handleIdentifier(toString, expressionContinuation)
+                            listener: handleNoTypeArguments(()
+                            parseArgumentsOpt(toString)
+                              parseArguments(toString)
+                                parseArgumentsRest(()
+                                  listener: beginArguments(()
+                                  listener: endArguments(0, (, ))
+                            listener: handleSend(toString, ;)
+                      listener: handleEndingBinaryExpression(.)
+                  ensureSemicolon())
+                  listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(2, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.parser.expect
new file mode 100644
index 0000000..a96a920
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.parser.expect
@@ -0,0 +1,25 @@
+void main(int onX) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+onX.toString();
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] onX[StringToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+onX[StringToken].[SimpleToken]toString[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.scanner.expect
new file mode 100644
index 0000000..a96a920
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block3_prime.dart.scanner.expect
@@ -0,0 +1,25 @@
+void main(int onX) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+onX.toString();
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] onX[StringToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+onX[StringToken].[SimpleToken]toString[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart
new file mode 100644
index 0000000..3f71e09
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart
@@ -0,0 +1,11 @@
+void main(int on) {
+  try {
+    ;
+  } catch (e) {
+    ;
+  } on Foo {
+    ;
+  }
+  on = 42;
+}
+
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.expect
new file mode 100644
index 0000000..52112c9
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.expect
@@ -0,0 +1,61 @@
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null)
+      handleVoidKeyword(void)
+      handleIdentifier(main, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(on)
+          handleType(int, null)
+          handleIdentifier(on, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginTryStatement(try)
+          beginBlock({, BlockKind(try statement))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(try statement))
+          beginCatchClause(catch)
+            beginFormalParameters((, MemberKind.Catch)
+              beginMetadataStar(e)
+              endMetadataStar(0)
+              beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                handleNoType(()
+                handleIdentifier(e, formalParameterDeclaration)
+                handleFormalParameterWithoutValue())
+              endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+            endFormalParameters(1, (, ), MemberKind.Catch)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(null, catch, null)
+          beginCatchClause(on)
+            handleIdentifier(Foo, typeReference)
+            handleNoTypeArguments({)
+            handleType(Foo, null)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(on, null, null)
+        endTryStatement(2, try, null)
+        handleIdentifier(on, expression)
+        handleNoTypeArguments(=)
+        handleNoArguments(=)
+        handleSend(on, =)
+        handleLiteralInt(42)
+        handleAssignmentExpression(=)
+        handleExpressionStatement(;)
+      endBlockFunctionBody(2, {, })
+    endTopLevelMethod(void, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.intertwined.expect
new file mode 100644
index 0000000..6735307
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.intertwined.expect
@@ -0,0 +1,135 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+        listener: beginTopLevelMethod(, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(on)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  inPlainSync()
+                  listener: handleIdentifier(on, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, try)
+          parseStatement({)
+            parseStatementX({)
+              parseTryStatement({)
+                listener: beginTryStatement(try)
+                parseBlock(try, BlockKind(try statement))
+                  ensureBlock(try, null, try statement)
+                  listener: beginBlock({, BlockKind(try statement))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(try statement))
+                listener: beginCatchClause(catch)
+                parseFormalParameters(catch, MemberKind.Catch)
+                  parseFormalParametersRest((, MemberKind.Catch)
+                    listener: beginFormalParameters((, MemberKind.Catch)
+                    parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+                      parseMetadataStar(()
+                        listener: beginMetadataStar(e)
+                        listener: endMetadataStar(0)
+                      listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                      listener: handleNoType(()
+                      ensureIdentifier((, formalParameterDeclaration)
+                        listener: handleIdentifier(e, formalParameterDeclaration)
+                      listener: handleFormalParameterWithoutValue())
+                      listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+                    listener: endFormalParameters(1, (, ), MemberKind.Catch)
+                listener: endCatchClause({)
+                parseBlock(), BlockKind(catch clause))
+                  ensureBlock(), null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(null, catch, null)
+                listener: beginCatchClause(on)
+                listener: handleIdentifier(Foo, typeReference)
+                listener: handleNoTypeArguments({)
+                listener: handleType(Foo, null)
+                listener: endCatchClause({)
+                parseBlock(Foo, BlockKind(catch clause))
+                  ensureBlock(Foo, null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(on, null, null)
+                listener: endTryStatement(2, try, null)
+          notEofOrValue(}, on)
+          parseStatement(})
+            parseStatementX(})
+              parseExpressionStatementOrDeclaration(}, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+                  looksLikeLocalFunction(on)
+                  parseExpressionStatement(})
+                    parseExpression(})
+                      parsePrecedenceExpression(}, 1, true)
+                        parseUnaryExpression(}, true)
+                          parsePrimary(}, expression)
+                            inPlainSync()
+                            parseSendOrFunctionLiteral(}, expression)
+                              parseSend(}, expression)
+                                isNextIdentifier(})
+                                ensureIdentifier(}, expression)
+                                  inPlainSync()
+                                  listener: handleIdentifier(on, expression)
+                                listener: handleNoTypeArguments(=)
+                                parseArgumentsOpt(on)
+                                  listener: handleNoArguments(=)
+                                listener: handleSend(on, =)
+                        parsePrecedenceExpression(=, 1, true)
+                          parseUnaryExpression(=, true)
+                            parsePrimary(=, expression)
+                              parseLiteralInt(=)
+                                listener: handleLiteralInt(42)
+                        listener: handleAssignmentExpression(=)
+                    ensureSemicolon(42)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(2, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.parser.expect
new file mode 100644
index 0000000..0af7587
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.parser.expect
@@ -0,0 +1,25 @@
+void main(int on) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+on = 42;
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] on[KeywordToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+on[KeywordToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.scanner.expect
new file mode 100644
index 0000000..0af7587
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.dart.scanner.expect
@@ -0,0 +1,25 @@
+void main(int on) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+on = 42;
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] on[KeywordToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+on[KeywordToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4.equivalence_info b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.equivalence_info
new file mode 100644
index 0000000..23cbacc
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4.equivalence_info
@@ -0,0 +1,5 @@
+files:
+  - call_on_after_try_block4.dart
+  - call_on_after_try_block4_prime.dart
+filters:
+  - ignoreListenerArguments
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart
new file mode 100644
index 0000000..7e56a69
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart
@@ -0,0 +1,11 @@
+void main(int onX) {
+  try {
+    ;
+  } catch (e) {
+    ;
+  } on Foo {
+    ;
+  }
+  onX = 42;
+}
+
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.expect
new file mode 100644
index 0000000..0df2227
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.expect
@@ -0,0 +1,61 @@
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null)
+      handleVoidKeyword(void)
+      handleIdentifier(main, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(onX)
+          handleType(int, null)
+          handleIdentifier(onX, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginTryStatement(try)
+          beginBlock({, BlockKind(try statement))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(try statement))
+          beginCatchClause(catch)
+            beginFormalParameters((, MemberKind.Catch)
+              beginMetadataStar(e)
+              endMetadataStar(0)
+              beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                handleNoType(()
+                handleIdentifier(e, formalParameterDeclaration)
+                handleFormalParameterWithoutValue())
+              endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+            endFormalParameters(1, (, ), MemberKind.Catch)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(null, catch, null)
+          beginCatchClause(on)
+            handleIdentifier(Foo, typeReference)
+            handleNoTypeArguments({)
+            handleType(Foo, null)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(on, null, null)
+        endTryStatement(2, try, null)
+        handleIdentifier(onX, expression)
+        handleNoTypeArguments(=)
+        handleNoArguments(=)
+        handleSend(onX, =)
+        handleLiteralInt(42)
+        handleAssignmentExpression(=)
+        handleExpressionStatement(;)
+      endBlockFunctionBody(2, {, })
+    endTopLevelMethod(void, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.intertwined.expect
new file mode 100644
index 0000000..869a099
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.intertwined.expect
@@ -0,0 +1,131 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+        listener: beginTopLevelMethod(, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(onX)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(onX, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, try)
+          parseStatement({)
+            parseStatementX({)
+              parseTryStatement({)
+                listener: beginTryStatement(try)
+                parseBlock(try, BlockKind(try statement))
+                  ensureBlock(try, null, try statement)
+                  listener: beginBlock({, BlockKind(try statement))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(try statement))
+                listener: beginCatchClause(catch)
+                parseFormalParameters(catch, MemberKind.Catch)
+                  parseFormalParametersRest((, MemberKind.Catch)
+                    listener: beginFormalParameters((, MemberKind.Catch)
+                    parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+                      parseMetadataStar(()
+                        listener: beginMetadataStar(e)
+                        listener: endMetadataStar(0)
+                      listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                      listener: handleNoType(()
+                      ensureIdentifier((, formalParameterDeclaration)
+                        listener: handleIdentifier(e, formalParameterDeclaration)
+                      listener: handleFormalParameterWithoutValue())
+                      listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+                    listener: endFormalParameters(1, (, ), MemberKind.Catch)
+                listener: endCatchClause({)
+                parseBlock(), BlockKind(catch clause))
+                  ensureBlock(), null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(null, catch, null)
+                listener: beginCatchClause(on)
+                listener: handleIdentifier(Foo, typeReference)
+                listener: handleNoTypeArguments({)
+                listener: handleType(Foo, null)
+                listener: endCatchClause({)
+                parseBlock(Foo, BlockKind(catch clause))
+                  ensureBlock(Foo, null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(on, null, null)
+                listener: endTryStatement(2, try, null)
+          notEofOrValue(}, onX)
+          parseStatement(})
+            parseStatementX(})
+              parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+                looksLikeLocalFunction(onX)
+                parseExpressionStatement(})
+                  parseExpression(})
+                    parsePrecedenceExpression(}, 1, true)
+                      parseUnaryExpression(}, true)
+                        parsePrimary(}, expression)
+                          parseSendOrFunctionLiteral(}, expression)
+                            parseSend(}, expression)
+                              isNextIdentifier(})
+                              ensureIdentifier(}, expression)
+                                listener: handleIdentifier(onX, expression)
+                              listener: handleNoTypeArguments(=)
+                              parseArgumentsOpt(onX)
+                                listener: handleNoArguments(=)
+                              listener: handleSend(onX, =)
+                      parsePrecedenceExpression(=, 1, true)
+                        parseUnaryExpression(=, true)
+                          parsePrimary(=, expression)
+                            parseLiteralInt(=)
+                              listener: handleLiteralInt(42)
+                      listener: handleAssignmentExpression(=)
+                  ensureSemicolon(42)
+                  listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(2, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.parser.expect
new file mode 100644
index 0000000..0b125f4
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.parser.expect
@@ -0,0 +1,25 @@
+void main(int onX) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+onX = 42;
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] onX[StringToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+onX[StringToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.scanner.expect
new file mode 100644
index 0000000..0b125f4
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block4_prime.dart.scanner.expect
@@ -0,0 +1,25 @@
+void main(int onX) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+onX = 42;
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] onX[StringToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+onX[StringToken] =[SimpleToken] 42[StringToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart
new file mode 100644
index 0000000..eeac09a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart
@@ -0,0 +1,11 @@
+void main(int on) {
+  try {
+    ;
+  } catch (e) {
+    ;
+  } on Foo {
+    ;
+  }
+  on;
+}
+
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.expect
new file mode 100644
index 0000000..c639d14
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.expect
@@ -0,0 +1,59 @@
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null)
+      handleVoidKeyword(void)
+      handleIdentifier(main, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(on)
+          handleType(int, null)
+          handleIdentifier(on, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginTryStatement(try)
+          beginBlock({, BlockKind(try statement))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(try statement))
+          beginCatchClause(catch)
+            beginFormalParameters((, MemberKind.Catch)
+              beginMetadataStar(e)
+              endMetadataStar(0)
+              beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                handleNoType(()
+                handleIdentifier(e, formalParameterDeclaration)
+                handleFormalParameterWithoutValue())
+              endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+            endFormalParameters(1, (, ), MemberKind.Catch)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(null, catch, null)
+          beginCatchClause(on)
+            handleIdentifier(Foo, typeReference)
+            handleNoTypeArguments({)
+            handleType(Foo, null)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(on, null, null)
+        endTryStatement(2, try, null)
+        handleIdentifier(on, expression)
+        handleNoTypeArguments(;)
+        handleNoArguments(;)
+        handleSend(on, ;)
+        handleExpressionStatement(;)
+      endBlockFunctionBody(2, {, })
+    endTopLevelMethod(void, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.intertwined.expect
new file mode 100644
index 0000000..93c805d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.intertwined.expect
@@ -0,0 +1,129 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+        listener: beginTopLevelMethod(, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(on)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  inPlainSync()
+                  listener: handleIdentifier(on, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, null, on, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, try)
+          parseStatement({)
+            parseStatementX({)
+              parseTryStatement({)
+                listener: beginTryStatement(try)
+                parseBlock(try, BlockKind(try statement))
+                  ensureBlock(try, null, try statement)
+                  listener: beginBlock({, BlockKind(try statement))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(try statement))
+                listener: beginCatchClause(catch)
+                parseFormalParameters(catch, MemberKind.Catch)
+                  parseFormalParametersRest((, MemberKind.Catch)
+                    listener: beginFormalParameters((, MemberKind.Catch)
+                    parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+                      parseMetadataStar(()
+                        listener: beginMetadataStar(e)
+                        listener: endMetadataStar(0)
+                      listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                      listener: handleNoType(()
+                      ensureIdentifier((, formalParameterDeclaration)
+                        listener: handleIdentifier(e, formalParameterDeclaration)
+                      listener: handleFormalParameterWithoutValue())
+                      listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+                    listener: endFormalParameters(1, (, ), MemberKind.Catch)
+                listener: endCatchClause({)
+                parseBlock(), BlockKind(catch clause))
+                  ensureBlock(), null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(null, catch, null)
+                listener: beginCatchClause(on)
+                listener: handleIdentifier(Foo, typeReference)
+                listener: handleNoTypeArguments({)
+                listener: handleType(Foo, null)
+                listener: endCatchClause({)
+                parseBlock(Foo, BlockKind(catch clause))
+                  ensureBlock(Foo, null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(on, null, null)
+                listener: endTryStatement(2, try, null)
+          notEofOrValue(}, on)
+          parseStatement(})
+            parseStatementX(})
+              parseExpressionStatementOrDeclaration(}, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+                  looksLikeLocalFunction(on)
+                  parseExpressionStatement(})
+                    parseExpression(})
+                      parsePrecedenceExpression(}, 1, true)
+                        parseUnaryExpression(}, true)
+                          parsePrimary(}, expression)
+                            inPlainSync()
+                            parseSendOrFunctionLiteral(}, expression)
+                              parseSend(}, expression)
+                                isNextIdentifier(})
+                                ensureIdentifier(}, expression)
+                                  inPlainSync()
+                                  listener: handleIdentifier(on, expression)
+                                listener: handleNoTypeArguments(;)
+                                parseArgumentsOpt(on)
+                                  listener: handleNoArguments(;)
+                                listener: handleSend(on, ;)
+                    ensureSemicolon(on)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(2, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.parser.expect
new file mode 100644
index 0000000..5e272ff
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.parser.expect
@@ -0,0 +1,25 @@
+void main(int on) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+on;
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] on[KeywordToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+on[KeywordToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.scanner.expect
new file mode 100644
index 0000000..5e272ff
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.dart.scanner.expect
@@ -0,0 +1,25 @@
+void main(int on) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+on;
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] on[KeywordToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+on[KeywordToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5.equivalence_info b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.equivalence_info
new file mode 100644
index 0000000..39d6b9d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5.equivalence_info
@@ -0,0 +1,5 @@
+files:
+  - call_on_after_try_block5.dart
+  - call_on_after_try_block5_prime.dart
+filters:
+  - ignoreListenerArguments
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart
new file mode 100644
index 0000000..8bd11f3
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart
@@ -0,0 +1,11 @@
+void main(int onX) {
+  try {
+    ;
+  } catch (e) {
+    ;
+  } on Foo {
+    ;
+  }
+  onX;
+}
+
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.expect
new file mode 100644
index 0000000..95a5d34
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.expect
@@ -0,0 +1,59 @@
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null)
+      handleVoidKeyword(void)
+      handleIdentifier(main, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+        beginMetadataStar(int)
+        endMetadataStar(0)
+        beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+          handleIdentifier(int, typeReference)
+          handleNoTypeArguments(onX)
+          handleType(int, null)
+          handleIdentifier(onX, formalParameterDeclaration)
+          handleFormalParameterWithoutValue())
+        endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginTryStatement(try)
+          beginBlock({, BlockKind(try statement))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(try statement))
+          beginCatchClause(catch)
+            beginFormalParameters((, MemberKind.Catch)
+              beginMetadataStar(e)
+              endMetadataStar(0)
+              beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                handleNoType(()
+                handleIdentifier(e, formalParameterDeclaration)
+                handleFormalParameterWithoutValue())
+              endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+            endFormalParameters(1, (, ), MemberKind.Catch)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(null, catch, null)
+          beginCatchClause(on)
+            handleIdentifier(Foo, typeReference)
+            handleNoTypeArguments({)
+            handleType(Foo, null)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(on, null, null)
+        endTryStatement(2, try, null)
+        handleIdentifier(onX, expression)
+        handleNoTypeArguments(;)
+        handleNoArguments(;)
+        handleSend(onX, ;)
+        handleExpressionStatement(;)
+      endBlockFunctionBody(2, {, })
+    endTopLevelMethod(void, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.intertwined.expect
new file mode 100644
index 0000000..ac6aa6d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.intertwined.expect
@@ -0,0 +1,125 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+        listener: beginTopLevelMethod(, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+                parseMetadataStar(()
+                  listener: beginMetadataStar(int)
+                  listener: endMetadataStar(0)
+                listener: beginFormalParameter(int, MemberKind.TopLevelMethod, null, null, null)
+                listener: handleIdentifier(int, typeReference)
+                listener: handleNoTypeArguments(onX)
+                listener: handleType(int, null)
+                ensureIdentifier(int, formalParameterDeclaration)
+                  listener: handleIdentifier(onX, formalParameterDeclaration)
+                listener: handleFormalParameterWithoutValue())
+                listener: endFormalParameter(null, null, null, onX, null, null, FormalParameterKind.mandatory, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, try)
+          parseStatement({)
+            parseStatementX({)
+              parseTryStatement({)
+                listener: beginTryStatement(try)
+                parseBlock(try, BlockKind(try statement))
+                  ensureBlock(try, null, try statement)
+                  listener: beginBlock({, BlockKind(try statement))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(try statement))
+                listener: beginCatchClause(catch)
+                parseFormalParameters(catch, MemberKind.Catch)
+                  parseFormalParametersRest((, MemberKind.Catch)
+                    listener: beginFormalParameters((, MemberKind.Catch)
+                    parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+                      parseMetadataStar(()
+                        listener: beginMetadataStar(e)
+                        listener: endMetadataStar(0)
+                      listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                      listener: handleNoType(()
+                      ensureIdentifier((, formalParameterDeclaration)
+                        listener: handleIdentifier(e, formalParameterDeclaration)
+                      listener: handleFormalParameterWithoutValue())
+                      listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+                    listener: endFormalParameters(1, (, ), MemberKind.Catch)
+                listener: endCatchClause({)
+                parseBlock(), BlockKind(catch clause))
+                  ensureBlock(), null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(null, catch, null)
+                listener: beginCatchClause(on)
+                listener: handleIdentifier(Foo, typeReference)
+                listener: handleNoTypeArguments({)
+                listener: handleType(Foo, null)
+                listener: endCatchClause({)
+                parseBlock(Foo, BlockKind(catch clause))
+                  ensureBlock(Foo, null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(on, null, null)
+                listener: endTryStatement(2, try, null)
+          notEofOrValue(}, onX)
+          parseStatement(})
+            parseStatementX(})
+              parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+                looksLikeLocalFunction(onX)
+                parseExpressionStatement(})
+                  parseExpression(})
+                    parsePrecedenceExpression(}, 1, true)
+                      parseUnaryExpression(}, true)
+                        parsePrimary(}, expression)
+                          parseSendOrFunctionLiteral(}, expression)
+                            parseSend(}, expression)
+                              isNextIdentifier(})
+                              ensureIdentifier(}, expression)
+                                listener: handleIdentifier(onX, expression)
+                              listener: handleNoTypeArguments(;)
+                              parseArgumentsOpt(onX)
+                                listener: handleNoArguments(;)
+                              listener: handleSend(onX, ;)
+                  ensureSemicolon(onX)
+                  listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(2, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.parser.expect
new file mode 100644
index 0000000..f75602b
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.parser.expect
@@ -0,0 +1,25 @@
+void main(int onX) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+onX;
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] onX[StringToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+onX[StringToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.scanner.expect
new file mode 100644
index 0000000..f75602b
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block5_prime.dart.scanner.expect
@@ -0,0 +1,25 @@
+void main(int onX) {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+onX;
+}
+
+
+
+void[KeywordToken] main[StringToken]([BeginToken]int[StringToken] onX[StringToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+onX[StringToken];[SimpleToken]
+}[SimpleToken]
+
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart
new file mode 100644
index 0000000..4313b11
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart
@@ -0,0 +1,13 @@
+void main() {
+  try {
+    ;
+  } catch (e) {
+    ;
+  } on Foo {
+    ;
+  }
+
+  onX();
+}
+
+void onX() {}
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.expect
new file mode 100644
index 0000000..634138f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.expect
@@ -0,0 +1,65 @@
+beginCompilationUnit(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(, null)
+      handleVoidKeyword(void)
+      handleIdentifier(main, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginTryStatement(try)
+          beginBlock({, BlockKind(try statement))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(try statement))
+          beginCatchClause(catch)
+            beginFormalParameters((, MemberKind.Catch)
+              beginMetadataStar(e)
+              endMetadataStar(0)
+              beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                handleNoType(()
+                handleIdentifier(e, formalParameterDeclaration)
+                handleFormalParameterWithoutValue())
+              endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+            endFormalParameters(1, (, ), MemberKind.Catch)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(null, catch, null)
+          beginCatchClause(on)
+            handleIdentifier(Foo, typeReference)
+            handleNoTypeArguments({)
+            handleType(Foo, null)
+          endCatchClause({)
+          beginBlock({, BlockKind(catch clause))
+            handleEmptyStatement(;)
+          endBlock(1, {, }, BlockKind(catch clause))
+          handleCatchBlock(on, null, null)
+        endTryStatement(2, try, null)
+        handleIdentifier(onX, expression)
+        handleNoTypeArguments(()
+        beginArguments(()
+        endArguments(0, (, ))
+        handleSend(onX, ;)
+        handleExpressionStatement(;)
+      endBlockFunctionBody(2, {, })
+    endTopLevelMethod(void, null, })
+  endTopLevelDeclaration(void)
+  beginMetadataStar(void)
+  endMetadataStar(0)
+  beginTopLevelMember(void)
+    beginTopLevelMethod(}, null)
+      handleVoidKeyword(void)
+      handleIdentifier(onX, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+      endBlockFunctionBody(0, {, })
+    endTopLevelMethod(void, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.intertwined.expect
new file mode 100644
index 0000000..c48756b
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.intertwined.expect
@@ -0,0 +1,144 @@
+parseUnit(void)
+  skipErrorTokens(void)
+  listener: beginCompilationUnit(void)
+  syntheticPreviousToken(void)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(, null, , Instance of 'VoidType', null, main, false)
+        listener: beginTopLevelMethod(, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, try)
+          parseStatement({)
+            parseStatementX({)
+              parseTryStatement({)
+                listener: beginTryStatement(try)
+                parseBlock(try, BlockKind(try statement))
+                  ensureBlock(try, null, try statement)
+                  listener: beginBlock({, BlockKind(try statement))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(try statement))
+                listener: beginCatchClause(catch)
+                parseFormalParameters(catch, MemberKind.Catch)
+                  parseFormalParametersRest((, MemberKind.Catch)
+                    listener: beginFormalParameters((, MemberKind.Catch)
+                    parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.Catch)
+                      parseMetadataStar(()
+                        listener: beginMetadataStar(e)
+                        listener: endMetadataStar(0)
+                      listener: beginFormalParameter(e, MemberKind.Catch, null, null, null)
+                      listener: handleNoType(()
+                      ensureIdentifier((, formalParameterDeclaration)
+                        listener: handleIdentifier(e, formalParameterDeclaration)
+                      listener: handleFormalParameterWithoutValue())
+                      listener: endFormalParameter(null, null, null, e, null, null, FormalParameterKind.mandatory, MemberKind.Catch)
+                    listener: endFormalParameters(1, (, ), MemberKind.Catch)
+                listener: endCatchClause({)
+                parseBlock(), BlockKind(catch clause))
+                  ensureBlock(), null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(null, catch, null)
+                listener: beginCatchClause(on)
+                listener: handleIdentifier(Foo, typeReference)
+                listener: handleNoTypeArguments({)
+                listener: handleType(Foo, null)
+                listener: endCatchClause({)
+                parseBlock(Foo, BlockKind(catch clause))
+                  ensureBlock(Foo, null, catch clause)
+                  listener: beginBlock({, BlockKind(catch clause))
+                  notEofOrValue(}, ;)
+                  parseStatement({)
+                    parseStatementX({)
+                      parseEmptyStatement({)
+                        listener: handleEmptyStatement(;)
+                  notEofOrValue(}, })
+                  listener: endBlock(1, {, }, BlockKind(catch clause))
+                listener: handleCatchBlock(on, null, null)
+                listener: endTryStatement(2, try, null)
+          notEofOrValue(}, onX)
+          parseStatement(})
+            parseStatementX(})
+              parseExpressionStatementOrDeclarationAfterModifiers(}, }, null, null, null, false)
+                looksLikeLocalFunction(onX)
+                parseExpressionStatement(})
+                  parseExpression(})
+                    parsePrecedenceExpression(}, 1, true)
+                      parseUnaryExpression(}, true)
+                        parsePrimary(}, expression)
+                          parseSendOrFunctionLiteral(}, expression)
+                            looksLikeFunctionBody(;)
+                            parseSend(}, expression)
+                              isNextIdentifier(})
+                              ensureIdentifier(}, expression)
+                                listener: handleIdentifier(onX, expression)
+                              listener: handleNoTypeArguments(()
+                              parseArgumentsOpt(onX)
+                                parseArguments(onX)
+                                  parseArgumentsRest(()
+                                    listener: beginArguments(()
+                                    listener: endArguments(0, (, ))
+                              listener: handleSend(onX, ;)
+                  ensureSemicolon())
+                  listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(2, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration(void)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(void)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl(})
+      listener: beginTopLevelMember(void)
+      parseTopLevelMethod(}, null, }, Instance of 'VoidType', null, onX, false)
+        listener: beginTopLevelMethod(}, null)
+        listener: handleVoidKeyword(void)
+        ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(onX, topLevelFunctionDeclaration)
+        parseMethodTypeVar(onX)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(onX, onX, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(onX, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(0, {, })
+        listener: endTopLevelMethod(void, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(void)
+  listener: endCompilationUnit(2, )
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.parser.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.parser.expect
new file mode 100644
index 0000000..cb01c79
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.parser.expect
@@ -0,0 +1,29 @@
+void main() {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+
+onX();
+}
+
+void onX() {}
+
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+
+onX[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+void[KeywordToken] onX[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.scanner.expect b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.scanner.expect
new file mode 100644
index 0000000..cb01c79
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/call_on_after_try_block_prime.dart.scanner.expect
@@ -0,0 +1,29 @@
+void main() {
+try {
+;
+} catch (e) {
+;
+} on Foo {
+;
+}
+
+onX();
+}
+
+void onX() {}
+
+
+void[KeywordToken] main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+try[KeywordToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] catch[KeywordToken] ([BeginToken]e[StringToken])[SimpleToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken] on[KeywordToken] Foo[StringToken] {[BeginToken]
+;[SimpleToken]
+}[SimpleToken]
+
+onX[StringToken]([BeginToken])[SimpleToken];[SimpleToken]
+}[SimpleToken]
+
+void[KeywordToken] onX[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/test/macro_application/data/pkgs/macro/lib/macro.dart b/pkg/front_end/test/macro_application/data/pkgs/macro/lib/macro.dart
index ff31d86..7b57f38 100644
--- a/pkg/front_end/test/macro_application/data/pkgs/macro/lib/macro.dart
+++ b/pkg/front_end/test/macro_application/data/pkgs/macro/lib/macro.dart
@@ -40,9 +40,8 @@
 
   FutureOr<void> buildTypesForFunction(
       FunctionDeclaration function, TypeBuilder builder) {
-    builder.declareType(new DeclarationCode.fromString('''
-class ${function.identifier.name}GeneratedClass {}
-'''));
+        var name = '${function.identifier.name}GeneratedClass';
+    builder.declareType(name, new DeclarationCode.fromString('class $name {}'));
   }
 }
 
diff --git a/pkg/front_end/test/macro_application/data/tests/types.dart b/pkg/front_end/test/macro_application/data/tests/types.dart
index c10a353..1d8ce17 100644
--- a/pkg/front_end/test/macro_application/data/tests/types.dart
+++ b/pkg/front_end/test/macro_application/data/tests/types.dart
@@ -6,12 +6,10 @@
 
 @FunctionTypesMacro1()
 /*member: topLevelFunction1:
-class topLevelFunction1GeneratedClass {}
-*/
+class topLevelFunction1GeneratedClass {}*/
 void topLevelFunction1() {}
 
 @FunctionTypesMacro1()
 /*member: topLevelFunction2:
-class topLevelFunction2GeneratedClass {}
-*/
+class topLevelFunction2GeneratedClass {}*/
 void topLevelFunction2() {}
diff --git a/pkg/front_end/test/macros/macro_test.dart b/pkg/front_end/test/macros/macro_test.dart
index 1bedb08..c4db330 100644
--- a/pkg/front_end/test/macros/macro_test.dart
+++ b/pkg/front_end/test/macros/macro_test.dart
@@ -387,5 +387,10 @@
   Iterable<DeclarationCode> augmentations = const [];
 
   @override
-  void serialize(Serializer serializer) {}
+  Iterable<String> newTypeNames = const [];
+
+  @override
+  void serialize(Serializer serializer) {
+    throw UnimplementedError();
+  }
 }
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index ca447e7..2fe783e 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -90,6 +90,7 @@
 backping
 backstop
 badly
+bail
 bang
 bar
 basically
@@ -670,6 +671,7 @@
 launcher
 layer
 layered
+layering
 layers
 layout
 lc
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index d69db07..6e70064 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -1249,6 +1249,7 @@
 follows
 food
 for
+forbidden
 force
 forced
 forest
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart
new file mode 100644
index 0000000..b2719d2
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart
@@ -0,0 +1,45 @@
+// 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.
+
+enum E {
+  one, // Ok.
+  two.named(), // Ok.
+  three.f(), // Error.
+  four.f2(); // Error.
+
+  const E();
+
+  const E.named()
+    : this(); // Ok.
+
+  factory E.f() => values.first;
+
+  factory E.f2() {
+    return const E(); // Error.
+  }
+
+  const factory E.f3() = E; // Error.
+
+  factory E.f4() = E; // Error.
+
+  factory E.f5() = E.f; // Ok.
+
+  factory E.f6(int value) = E.f; // Error.
+}
+
+test() {
+  new E(); // Error.
+  const E(); // Error.
+  E.new; // Error.
+
+  new E.named(); // Error.
+  const E().named(); // Error.
+  E.named; // Error.
+
+  new E.f(); // Ok.
+  const E.f(); // Error.
+  E.f; // Ok.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.expect
new file mode 100644
index 0000000..0b6fe6e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.expect
@@ -0,0 +1,156 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+//   const factory E.f3() = E; // Error.
+//                          ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+//   factory E.f4() = E; // Error.
+//                    ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+//   three.f(), // Error.
+//        ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+//   four.f2(); // Error.
+//       ^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+//   factory E.f6(int value) = E.f; // Error.
+//                             ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+//     return const E(); // Error.
+//                  ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+//   new E(); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+//   const E(); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+//   E.new; // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+//   new E.named(); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+//   const E().named(); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+//   E.named; // Error.
+//     ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   const E.f(); // Error.
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+  three.f(), // Error.
+       ^";
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+  three.f(), // Error.
+       ^";
+  static const field self::E four = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+  four.f2(); // Error.
+      ^^";
+  static final field dynamic _redirecting# = <dynamic>[#C7, #C8, #C9, #C10]/*isLegacy*/;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name) → self::E
+    : this self::E::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+  static factory f() → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+  three.f(), // Error.
+       ^".{core::Iterable::first}{self::E};
+  static factory f2() → self::E {
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+    return const E(); // Error.
+                 ^";
+  }
+  static factory f3() → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+  const factory E.f3() = E; // Error.
+                         ^";
+  static factory f4() → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+  factory E.f4() = E; // Error.
+                   ^";
+  static factory f5() → self::E
+    return self::E::f();
+  static factory f6(core::int value) → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+  factory E.f6(int value) = E.f; // Error.
+                            ^";
+}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+  new E(); // Error.
+      ^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+  const E(); // Error.
+        ^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+  E.new; // Error.
+    ^^^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+  new E.named(); // Error.
+      ^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+  const E().named(); // Error.
+        ^"{dynamic}.named();
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+  E.named; // Error.
+    ^^^^^";
+  self::E::f();
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  const E.f(); // Error.
+        ^";
+  #C11;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = constructor-tearoff self::E::f3
+  #C8 = constructor-tearoff self::E::f4
+  #C9 = constructor-tearoff self::E::f5
+  #C10 = constructor-tearoff self::E::f6
+  #C11 = constructor-tearoff self::E::f
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constructor_calls.dart:
+- E. (from org-dartlang-testcase:///constructor_calls.dart:11:9)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E.named (from org-dartlang-testcase:///constructor_calls.dart:13:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.transformed.expect
new file mode 100644
index 0000000..0b6fe6e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.transformed.expect
@@ -0,0 +1,156 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+//   const factory E.f3() = E; // Error.
+//                          ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+//   factory E.f4() = E; // Error.
+//                    ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+//   three.f(), // Error.
+//        ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+//   four.f2(); // Error.
+//       ^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+//   factory E.f6(int value) = E.f; // Error.
+//                             ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+//     return const E(); // Error.
+//                  ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+//   new E(); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+//   const E(); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+//   E.new; // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+//   new E.named(); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+//   const E().named(); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+//   E.named; // Error.
+//     ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   const E.f(); // Error.
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+  three.f(), // Error.
+       ^";
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+  three.f(), // Error.
+       ^";
+  static const field self::E four = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+  four.f2(); // Error.
+      ^^";
+  static final field dynamic _redirecting# = <dynamic>[#C7, #C8, #C9, #C10]/*isLegacy*/;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name) → self::E
+    : this self::E::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+  static factory f() → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+  three.f(), // Error.
+       ^".{core::Iterable::first}{self::E};
+  static factory f2() → self::E {
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+    return const E(); // Error.
+                 ^";
+  }
+  static factory f3() → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+  const factory E.f3() = E; // Error.
+                         ^";
+  static factory f4() → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+  factory E.f4() = E; // Error.
+                   ^";
+  static factory f5() → self::E
+    return self::E::f();
+  static factory f6(core::int value) → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+  factory E.f6(int value) = E.f; // Error.
+                            ^";
+}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+  new E(); // Error.
+      ^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+  const E(); // Error.
+        ^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+  E.new; // Error.
+    ^^^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+  new E.named(); // Error.
+      ^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+  const E().named(); // Error.
+        ^"{dynamic}.named();
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+  E.named; // Error.
+    ^^^^^";
+  self::E::f();
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  const E.f(); // Error.
+        ^";
+  #C11;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = constructor-tearoff self::E::f3
+  #C8 = constructor-tearoff self::E::f4
+  #C9 = constructor-tearoff self::E::f5
+  #C10 = constructor-tearoff self::E::f6
+  #C11 = constructor-tearoff self::E::f
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constructor_calls.dart:
+- E. (from org-dartlang-testcase:///constructor_calls.dart:11:9)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E.named (from org-dartlang-testcase:///constructor_calls.dart:13:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.textual_outline.expect
new file mode 100644
index 0000000..672888e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+enum E { one, two.named(), three.f(), four.f2(); const E(); const E.named() : this(); factory E.f() => values.first; factory E.f2() { return const E(); } const factory E.f3() = E; factory E.f4() = E; factory E.f5() = E.f; factory E.f6(int value) = E.f; }
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.expect
new file mode 100644
index 0000000..0b6fe6e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.expect
@@ -0,0 +1,156 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+//   const factory E.f3() = E; // Error.
+//                          ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+//   factory E.f4() = E; // Error.
+//                    ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+//   three.f(), // Error.
+//        ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+//   four.f2(); // Error.
+//       ^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+//   factory E.f6(int value) = E.f; // Error.
+//                             ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+//     return const E(); // Error.
+//                  ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+//   new E(); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+//   const E(); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+//   E.new; // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+//   new E.named(); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+//   const E().named(); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+//   E.named; // Error.
+//     ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   const E.f(); // Error.
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+  three.f(), // Error.
+       ^";
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+  three.f(), // Error.
+       ^";
+  static const field self::E four = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+  four.f2(); // Error.
+      ^^";
+  static final field dynamic _redirecting# = <dynamic>[#C7, #C8, #C9, #C10]/*isLegacy*/;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name) → self::E
+    : this self::E::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+  static factory f() → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+  three.f(), // Error.
+       ^".{core::Iterable::first}{self::E};
+  static factory f2() → self::E {
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+    return const E(); // Error.
+                 ^";
+  }
+  static factory f3() → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+  const factory E.f3() = E; // Error.
+                         ^";
+  static factory f4() → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+  factory E.f4() = E; // Error.
+                   ^";
+  static factory f5() → self::E
+    return self::E::f();
+  static factory f6(core::int value) → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+  factory E.f6(int value) = E.f; // Error.
+                            ^";
+}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+  new E(); // Error.
+      ^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+  const E(); // Error.
+        ^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+  E.new; // Error.
+    ^^^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+  new E.named(); // Error.
+      ^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+  const E().named(); // Error.
+        ^"{dynamic}.named();
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+  E.named; // Error.
+    ^^^^^";
+  self::E::f();
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  const E.f(); // Error.
+        ^";
+  #C11;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = constructor-tearoff self::E::f3
+  #C8 = constructor-tearoff self::E::f4
+  #C9 = constructor-tearoff self::E::f5
+  #C10 = constructor-tearoff self::E::f6
+  #C11 = constructor-tearoff self::E::f
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constructor_calls.dart:
+- E. (from org-dartlang-testcase:///constructor_calls.dart:11:9)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E.named (from org-dartlang-testcase:///constructor_calls.dart:13:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.modular.expect
new file mode 100644
index 0000000..0b6fe6e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.modular.expect
@@ -0,0 +1,156 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+//   const factory E.f3() = E; // Error.
+//                          ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+//   factory E.f4() = E; // Error.
+//                    ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+//   three.f(), // Error.
+//        ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+//   four.f2(); // Error.
+//       ^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+//   factory E.f6(int value) = E.f; // Error.
+//                             ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+//     return const E(); // Error.
+//                  ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+//   new E(); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+//   const E(); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+//   E.new; // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+//   new E.named(); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+//   const E().named(); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+//   E.named; // Error.
+//     ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   const E.f(); // Error.
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+  three.f(), // Error.
+       ^";
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+  three.f(), // Error.
+       ^";
+  static const field self::E four = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+  four.f2(); // Error.
+      ^^";
+  static final field dynamic _redirecting# = <dynamic>[#C7, #C8, #C9, #C10]/*isLegacy*/;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name) → self::E
+    : this self::E::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+  static factory f() → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+  three.f(), // Error.
+       ^".{core::Iterable::first}{self::E};
+  static factory f2() → self::E {
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+    return const E(); // Error.
+                 ^";
+  }
+  static factory f3() → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+  const factory E.f3() = E; // Error.
+                         ^";
+  static factory f4() → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+  factory E.f4() = E; // Error.
+                   ^";
+  static factory f5() → self::E
+    return self::E::f();
+  static factory f6(core::int value) → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+  factory E.f6(int value) = E.f; // Error.
+                            ^";
+}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+  new E(); // Error.
+      ^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+  const E(); // Error.
+        ^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+  E.new; // Error.
+    ^^^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+  new E.named(); // Error.
+      ^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+  const E().named(); // Error.
+        ^"{dynamic}.named();
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+  E.named; // Error.
+    ^^^^^";
+  self::E::f();
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  const E.f(); // Error.
+        ^";
+  #C11;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = constructor-tearoff self::E::f3
+  #C8 = constructor-tearoff self::E::f4
+  #C9 = constructor-tearoff self::E::f5
+  #C10 = constructor-tearoff self::E::f6
+  #C11 = constructor-tearoff self::E::f
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constructor_calls.dart:
+- E. (from org-dartlang-testcase:///constructor_calls.dart:11:9)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E.named (from org-dartlang-testcase:///constructor_calls.dart:13:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.outline.expect
new file mode 100644
index 0000000..220fd42
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.outline.expect
@@ -0,0 +1,83 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+//   const factory E.f3() = E; // Error.
+//                          ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+//   factory E.f4() = E; // Error.
+//                    ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+//   three.f(), // Error.
+//        ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+//   four.f2(); // Error.
+//       ^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+//   factory E.f6(int value) = E.f; // Error.
+//                             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = const <self::E>[self::E::one, self::E::two, self::E::three, self::E::four];
+  static const field self::E one = const self::E::•(0, "one");
+  static const field self::E two = const self::E::named(1, "two");
+  static const field self::E three = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+  three.f(), // Error.
+       ^";
+  static const field self::E four = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+  four.f2(); // Error.
+      ^^";
+  static final field dynamic _redirecting# = <dynamic>[self::E::f3, self::E::f4, self::E::f5, self::E::f6]/*isLegacy*/;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name) → self::E
+    : this self::E::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+  static factory f() → self::E
+    ;
+  static factory f2() → self::E
+    ;
+  static factory f3() → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+  const factory E.f3() = E; // Error.
+                         ^";
+  static factory f4() → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+  factory E.f4() = E; // Error.
+                   ^";
+  static factory f5() → self::E
+    return self::E::f();
+  static factory f6(core::int value) → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+  factory E.f6(int value) = E.f; // Error.
+                            ^";
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///constructor_calls.dart:5:6 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "one"})
+Evaluated: StaticGet @ org-dartlang-testcase:///constructor_calls.dart:5:6 -> InstanceConstant(const E{_Enum.index: 1, _Enum._name: "two"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constructor_calls.dart:6:3 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "one"})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constructor_calls.dart:7:3 -> InstanceConstant(const E{_Enum.index: 1, _Enum._name: "two"})
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///constructor_calls.dart:5:6 -> ConstructorTearOffConstant(E.f3)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///constructor_calls.dart:5:6 -> ConstructorTearOffConstant(E.f4)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///constructor_calls.dart:5:6 -> ConstructorTearOffConstant(E.f5)
+Evaluated: ConstructorTearOff @ org-dartlang-testcase:///constructor_calls.dart:5:6 -> ConstructorTearOffConstant(E.f6)
+Extra constant evaluation: evaluated: 20, effectively constant: 8
diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.transformed.expect
new file mode 100644
index 0000000..0b6fe6e
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.weak.transformed.expect
@@ -0,0 +1,156 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+//   const factory E.f3() = E; // Error.
+//                          ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+//   factory E.f4() = E; // Error.
+//                    ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+//   three.f(), // Error.
+//        ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+//   four.f2(); // Error.
+//       ^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+//  - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+//   factory E.f6(int value) = E.f; // Error.
+//                             ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+//     return const E(); // Error.
+//                  ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+//   new E(); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+//   const E(); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+//   E.new; // Error.
+//     ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+//   new E.named(); // Error.
+//       ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+//   const E().named(); // Error.
+//         ^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+//   E.named; // Error.
+//     ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   const E.f(); // Error.
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+  three.f(), // Error.
+       ^";
+  static const field self::E one = #C3;
+  static const field self::E two = #C6;
+  static const field self::E three = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+  three.f(), // Error.
+       ^";
+  static const field self::E four = invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:9:7: Error: Couldn't find constructor 'E.f2'.
+  four.f2(); // Error.
+      ^^";
+  static final field dynamic _redirecting# = <dynamic>[#C7, #C8, #C9, #C10]/*isLegacy*/;
+  const constructor •(core::int index, core::String name) → self::E
+    : super core::_Enum::•(index, name)
+    ;
+  const constructor named(core::int index, core::String name) → self::E
+    : this self::E::•(index, name)
+    ;
+  method toString() → core::String
+    return "E.${this.{core::_Enum::_name}{core::String}}";
+  static factory f() → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:8:8: Error: Couldn't find constructor 'E.f'.
+  three.f(), // Error.
+       ^".{core::Iterable::first}{self::E};
+  static factory f2() → self::E {
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:19:18: Error: Enums can't be instantiated.
+    return const E(); // Error.
+                 ^";
+  }
+  static factory f3() → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:22:26: Error: Enum factory constructors can't redirect to generative constructors.
+  const factory E.f3() = E; // Error.
+                         ^";
+  static factory f4() → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:24:20: Error: Enum factory constructors can't redirect to generative constructors.
+  factory E.f4() = E; // Error.
+                   ^";
+  static factory f5() → self::E
+    return self::E::f();
+  static factory f6(core::int value) → self::E
+    return invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:28:29: Error: The constructor function type 'E Function()' isn't a subtype of 'E Function(int)'.
+ - 'E' is from 'pkg/front_end/testcases/enhanced_enums/constructor_calls.dart'.
+  factory E.f6(int value) = E.f; // Error.
+                            ^";
+}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:32:7: Error: Enums can't be instantiated.
+  new E(); // Error.
+      ^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:33:9: Error: Enums can't be instantiated.
+  const E(); // Error.
+        ^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:34:5: Error: Enum constructors can't be torn off.
+  E.new; // Error.
+    ^^^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:36:7: Error: Enums can't be instantiated.
+  new E.named(); // Error.
+      ^";
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:37:9: Error: Enums can't be instantiated.
+  const E().named(); // Error.
+        ^"{dynamic}.named();
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:38:5: Error: Enum constructors can't be torn off.
+  E.named; // Error.
+    ^^^^^";
+  self::E::f();
+  invalid-expression "pkg/front_end/testcases/enhanced_enums/constructor_calls.dart:41:9: Error: Cannot invoke a non-'const' factory where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  const E.f(); // Error.
+        ^";
+  #C11;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "one"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "two"
+  #C6 = self::E {index:#C4, _name:#C5}
+  #C7 = constructor-tearoff self::E::f3
+  #C8 = constructor-tearoff self::E::f4
+  #C9 = constructor-tearoff self::E::f5
+  #C10 = constructor-tearoff self::E::f6
+  #C11 = constructor-tearoff self::E::f
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///constructor_calls.dart:
+- E. (from org-dartlang-testcase:///constructor_calls.dart:11:9)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E.named (from org-dartlang-testcase:///constructor_calls.dart:13:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect
index 7321935..6da4cc5 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect
@@ -14,7 +14,7 @@
   static const field self::E<core::int, core::String> one = #C3;
   static const field self::E<core::double, core::num> two = #C6;
   static const field self::E<core::int, core::int> three = #C9;
-  static const field self::E<dynamic, dynamic> four = #C12;
+  static const field self::E<core::num, core::bool> four = #C12;
   const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
     : super core::_Enum::•(index, name)
     ;
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect
index 7321935..6da4cc5 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect
@@ -14,7 +14,7 @@
   static const field self::E<core::int, core::String> one = #C3;
   static const field self::E<core::double, core::num> two = #C6;
   static const field self::E<core::int, core::int> three = #C9;
-  static const field self::E<dynamic, dynamic> four = #C12;
+  static const field self::E<core::num, core::bool> four = #C12;
   const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
     : super core::_Enum::•(index, name)
     ;
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect
index 5598791..cc9e359 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect
@@ -14,7 +14,7 @@
   static const field self::E<core::int, core::String> one = #C3;
   static const field self::E<core::double, core::num> two = #C6;
   static const field self::E<core::int, core::int> three = #C9;
-  static const field self::E<dynamic, dynamic> four = #C12;
+  static const field self::E<core::num, core::bool> four = #C12;
   const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
     : super core::_Enum::•(index, name)
     ;
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect
index 5598791..cc9e359 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect
@@ -14,7 +14,7 @@
   static const field self::E<core::int, core::String> one = #C3;
   static const field self::E<core::double, core::num> two = #C6;
   static const field self::E<core::int, core::int> three = #C9;
-  static const field self::E<dynamic, dynamic> four = #C12;
+  static const field self::E<core::num, core::bool> four = #C12;
   const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
     : super core::_Enum::•(index, name)
     ;
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect
index c39aa4b..d5da873 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect
@@ -14,7 +14,7 @@
   static const field self::E<core::int, core::String> one = const self::E::•<core::int, core::String>(0, "one");
   static const field self::E<core::double, core::num> two = const self::E::•<core::double, core::num>(1, "two");
   static const field self::E<core::int, core::int> three = const self::E::named<core::int, core::int>(2, "three", 42);
-  static const field self::E<dynamic, dynamic> four = const self::E::•<core::num, core::bool>(3, "four");
+  static const field self::E<core::num, core::bool> four = const self::E::•<core::num, core::bool>(3, "four");
   const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
     : super core::_Enum::•(index, name)
     ;
diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect
index 5598791..cc9e359 100644
--- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect
@@ -14,7 +14,7 @@
   static const field self::E<core::int, core::String> one = #C3;
   static const field self::E<core::double, core::num> two = #C6;
   static const field self::E<core::int, core::int> three = #C9;
-  static const field self::E<dynamic, dynamic> four = #C12;
+  static const field self::E<core::num, core::bool> four = #C12;
   const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
     : super core::_Enum::•(index, name)
     ;
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.expect
index 0f6d2ba..d0efd75 100644
--- a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.expect
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.expect
@@ -2,6 +2,10 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+//   f3.foo();
+//     ^
+//
 // pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
 //   f1,
 //     ^
@@ -10,10 +14,6 @@
 //   f2(42),
 //     ^
 //
-// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
-//   f3.foo();
-//     ^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.transformed.expect
index 0f6d2ba..d0efd75 100644
--- a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.strong.transformed.expect
@@ -2,6 +2,10 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+//   f3.foo();
+//     ^
+//
 // pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
 //   f1,
 //     ^
@@ -10,10 +14,6 @@
 //   f2(42),
 //     ^
 //
-// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
-//   f3.foo();
-//     ^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.expect
index ff44426..e5315e1 100644
--- a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.expect
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.expect
@@ -2,6 +2,10 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+//   f3.foo();
+//     ^
+//
 // pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
 //   f1,
 //     ^
@@ -10,10 +14,6 @@
 //   f2(42),
 //     ^
 //
-// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
-//   f3.foo();
-//     ^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.modular.expect
index ff44426..e5315e1 100644
--- a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.modular.expect
@@ -2,6 +2,10 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+//   f3.foo();
+//     ^
+//
 // pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
 //   f1,
 //     ^
@@ -10,10 +14,6 @@
 //   f2(42),
 //     ^
 //
-// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
-//   f3.foo();
-//     ^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.outline.expect
index dbb7eac..d61af01 100644
--- a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.outline.expect
@@ -2,6 +2,10 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+//   f3.foo();
+//     ^
+//
 // pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
 //   f1,
 //     ^
@@ -10,10 +14,6 @@
 //   f2(42),
 //     ^
 //
-// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
-//   f3.foo();
-//     ^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.transformed.expect
index ff44426..e5315e1 100644
--- a/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/issue48181.dart.weak.transformed.expect
@@ -2,6 +2,10 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
+//   f3.foo();
+//     ^
+//
 // pkg/front_end/testcases/enhanced_enums/issue48181.dart:12:5: Error: Couldn't find constructor 'F'.
 //   f1,
 //     ^
@@ -10,10 +14,6 @@
 //   f2(42),
 //     ^
 //
-// pkg/front_end/testcases/enhanced_enums/issue48181.dart:14:5: Error: Couldn't find constructor 'F.foo'.
-//   f3.foo();
-//     ^^^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart
new file mode 100644
index 0000000..7869a49
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2021, 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.
+
+enum E1 {
+  element;
+
+  E1(); // Error.
+  E1.named(); // Error.
+}
+
+enum E2 {
+  one.named1(),
+  two.named2();
+
+  const E2.named1() : super(); // Error.
+  const E2.named2() : super(42, "42"); // Error.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.strong.expect
new file mode 100644
index 0000000..022e129
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.strong.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+//   E1(); // Error.
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+//   E1.named(); // Error.
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   element;
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+//   const E2.named1() : super(); // Error.
+//                       ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+//   const E2.named2() : super(42, "42"); // Error.
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  element;
+  ^";
+  static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  element;
+  ^";
+  constructor •(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  constructor named(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named1() : super(); // Error.
+                      ^";
+  static const field self::E2 one = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named1() : super(); // Error.
+                      ^";
+  static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named2() : super(42, \"42\"); // Error.
+                      ^";
+  const constructor named1(core::int index, core::String name) → self::E2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named1() : super(); // Error.
+                      ^"
+    ;
+  const constructor named2(core::int index, core::String name) → self::E2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named2() : super(42, \"42\"); // Error.
+                      ^"
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///malformed_constructors.dart:
+- E2.named1 (from org-dartlang-testcase:///malformed_constructors.dart:16:9)
+- E2.named2 (from org-dartlang-testcase:///malformed_constructors.dart:17:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.strong.transformed.expect
new file mode 100644
index 0000000..022e129
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.strong.transformed.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+//   E1(); // Error.
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+//   E1.named(); // Error.
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   element;
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+//   const E2.named1() : super(); // Error.
+//                       ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+//   const E2.named2() : super(42, "42"); // Error.
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  element;
+  ^";
+  static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  element;
+  ^";
+  constructor •(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  constructor named(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named1() : super(); // Error.
+                      ^";
+  static const field self::E2 one = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named1() : super(); // Error.
+                      ^";
+  static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named2() : super(42, \"42\"); // Error.
+                      ^";
+  const constructor named1(core::int index, core::String name) → self::E2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named1() : super(); // Error.
+                      ^"
+    ;
+  const constructor named2(core::int index, core::String name) → self::E2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named2() : super(42, \"42\"); // Error.
+                      ^"
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///malformed_constructors.dart:
+- E2.named1 (from org-dartlang-testcase:///malformed_constructors.dart:16:9)
+- E2.named2 (from org-dartlang-testcase:///malformed_constructors.dart:17:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.textual_outline.expect
new file mode 100644
index 0000000..4aac745
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+enum E1 { element; E1(); E1.named(); }
+enum E2 { one.named1(), two.named2(); const E2.named1() : super(); const E2.named2() : super(42, "42"); }
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.expect
new file mode 100644
index 0000000..022e129
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+//   E1(); // Error.
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+//   E1.named(); // Error.
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   element;
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+//   const E2.named1() : super(); // Error.
+//                       ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+//   const E2.named2() : super(42, "42"); // Error.
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  element;
+  ^";
+  static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  element;
+  ^";
+  constructor •(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  constructor named(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named1() : super(); // Error.
+                      ^";
+  static const field self::E2 one = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named1() : super(); // Error.
+                      ^";
+  static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named2() : super(42, \"42\"); // Error.
+                      ^";
+  const constructor named1(core::int index, core::String name) → self::E2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named1() : super(); // Error.
+                      ^"
+    ;
+  const constructor named2(core::int index, core::String name) → self::E2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named2() : super(42, \"42\"); // Error.
+                      ^"
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///malformed_constructors.dart:
+- E2.named1 (from org-dartlang-testcase:///malformed_constructors.dart:16:9)
+- E2.named2 (from org-dartlang-testcase:///malformed_constructors.dart:17:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.modular.expect
new file mode 100644
index 0000000..022e129
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.modular.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+//   E1(); // Error.
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+//   E1.named(); // Error.
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   element;
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+//   const E2.named1() : super(); // Error.
+//                       ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+//   const E2.named2() : super(42, "42"); // Error.
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  element;
+  ^";
+  static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  element;
+  ^";
+  constructor •(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  constructor named(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named1() : super(); // Error.
+                      ^";
+  static const field self::E2 one = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named1() : super(); // Error.
+                      ^";
+  static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named2() : super(42, \"42\"); // Error.
+                      ^";
+  const constructor named1(core::int index, core::String name) → self::E2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named1() : super(); // Error.
+                      ^"
+    ;
+  const constructor named2(core::int index, core::String name) → self::E2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named2() : super(42, \"42\"); // Error.
+                      ^"
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///malformed_constructors.dart:
+- E2.named1 (from org-dartlang-testcase:///malformed_constructors.dart:16:9)
+- E2.named2 (from org-dartlang-testcase:///malformed_constructors.dart:17:9)
diff --git a/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.outline.expect
new file mode 100644
index 0000000..c6d15b1
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.outline.expect
@@ -0,0 +1,60 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+//   E1(); // Error.
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+//   E1.named(); // Error.
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   element;
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+//   const E2.named1() : super(); // Error.
+//                       ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+//   const E2.named2() : super(42, "42"); // Error.
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = const <self::E1>[self::E1::element];
+  static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  element;
+  ^";
+  constructor •(core::int index, core::String name) → self::E1
+    ;
+  constructor named(core::int index, core::String name) → self::E1
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = const <self::E2>[self::E2::one, self::E2::two];
+  static const field self::E2 one = const self::E2::named1(0, "one");
+  static const field self::E2 two = const self::E2::named2(1, "two");
+  const constructor named1(core::int index, core::String name) → self::E2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named1() : super(); // Error.
+                      ^"
+    ;
+  const constructor named2(core::int index, core::String name) → self::E2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named2() : super(42, \"42\"); // Error.
+                      ^"
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.transformed.expect
new file mode 100644
index 0000000..022e129
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart.weak.transformed.expect
@@ -0,0 +1,77 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:8:3: Error: Generative enum constructors must be marked as 'const'.
+//   E1(); // Error.
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:9:3: Error: Generative enum constructors must be marked as 'const'.
+//   E1.named(); // Error.
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   element;
+//   ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+//   const E2.named1() : super(); // Error.
+//                       ^
+//
+// pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+//   const E2.named2() : super(42, "42"); // Error.
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  element;
+  ^";
+  static const field invalid-type element = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  element;
+  ^";
+  constructor •(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  constructor named(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named1() : super(); // Error.
+                      ^";
+  static const field self::E2 one = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named1() : super(); // Error.
+                      ^";
+  static const field self::E2 two = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named2() : super(42, \"42\"); // Error.
+                      ^";
+  const constructor named1(core::int index, core::String name) → self::E2
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:16:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named1() : super(); // Error.
+                      ^"
+    ;
+  const constructor named2(core::int index, core::String name) → self::E2
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/enhanced_enums/malformed_constructors.dart:17:23: Error: Enum constructors can't contain super-initializers.
+  const E2.named2() : super(42, \"42\"); // Error.
+                      ^"
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+}
+static method main() → dynamic {}
+
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///malformed_constructors.dart:
+- E2.named1 (from org-dartlang-testcase:///malformed_constructors.dart:16:9)
+- E2.named2 (from org-dartlang-testcase:///malformed_constructors.dart:17:9)
diff --git a/pkg/front_end/testcases/expression/platform_isandroid.expression.yaml b/pkg/front_end/testcases/expression/platform_isandroid.expression.yaml
new file mode 100644
index 0000000..eabefb8
--- /dev/null
+++ b/pkg/front_end/testcases/expression/platform_isandroid.expression.yaml
@@ -0,0 +1,10 @@
+# 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.
+
+entry_point: "main.dart"
+definitions: []
+position: "dart:io"
+static: true
+expression: |
+  Platform.isAndroid
diff --git a/pkg/front_end/testcases/expression/platform_isandroid.expression.yaml.expect b/pkg/front_end/testcases/expression/platform_isandroid.expression.yaml.expect
new file mode 100644
index 0000000..872d5f9
--- /dev/null
+++ b/pkg/front_end/testcases/expression/platform_isandroid.expression.yaml.expect
@@ -0,0 +1,4 @@
+Errors: {
+}
+static method /*isLegacy, from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
+  return dart.io::Platform::isAndroid;
diff --git a/pkg/front_end/testcases/general/issue48242.dart b/pkg/front_end/testcases/general/issue48242.dart
new file mode 100644
index 0000000..31998b5
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48242.dart
@@ -0,0 +1,14 @@
+// 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.
+
+mixin Base {
+  Object? methodWithDefaultImpl() {}
+}
+
+mixin TestFailure<A> on Base {
+  @override
+  methodWithDefaultImpl({A? nameParam});
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/general/issue48242.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue48242.dart.textual_outline.expect
new file mode 100644
index 0000000..c106a99
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48242.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+mixin Base {
+  Object? methodWithDefaultImpl() {}
+}
+mixin TestFailure<A> on Base {
+  @override
+  methodWithDefaultImpl({A? nameParam});
+}
+void main() {}
diff --git a/pkg/front_end/testcases/general/issue48242.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue48242.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..c106a99
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48242.dart.textual_outline_modelled.expect
@@ -0,0 +1,8 @@
+mixin Base {
+  Object? methodWithDefaultImpl() {}
+}
+mixin TestFailure<A> on Base {
+  @override
+  methodWithDefaultImpl({A? nameParam});
+}
+void main() {}
diff --git a/pkg/front_end/testcases/general/issue48242.dart.weak.expect b/pkg/front_end/testcases/general/issue48242.dart.weak.expect
new file mode 100644
index 0000000..679b8d1
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48242.dart.weak.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Base extends core::Object /*isMixinDeclaration*/  {
+  method methodWithDefaultImpl() → core::Object? {}
+}
+abstract class TestFailure<A extends core::Object? = dynamic> extends self::Base /*isMixinDeclaration*/  {
+  @#C1
+  abstract method methodWithDefaultImpl({covariant-by-class self::TestFailure::A? nameParam = #C2}) → core::Object?;
+}
+static method main() → void {}
+
+constants  {
+  #C1 = core::_Override {}
+  #C2 = null
+}
diff --git a/pkg/front_end/testcases/general/issue48242.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue48242.dart.weak.modular.expect
new file mode 100644
index 0000000..679b8d1
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48242.dart.weak.modular.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Base extends core::Object /*isMixinDeclaration*/  {
+  method methodWithDefaultImpl() → core::Object? {}
+}
+abstract class TestFailure<A extends core::Object? = dynamic> extends self::Base /*isMixinDeclaration*/  {
+  @#C1
+  abstract method methodWithDefaultImpl({covariant-by-class self::TestFailure::A? nameParam = #C2}) → core::Object?;
+}
+static method main() → void {}
+
+constants  {
+  #C1 = core::_Override {}
+  #C2 = null
+}
diff --git a/pkg/front_end/testcases/general/issue48242.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue48242.dart.weak.outline.expect
new file mode 100644
index 0000000..fe420e8
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48242.dart.weak.outline.expect
@@ -0,0 +1,19 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Base extends core::Object /*isMixinDeclaration*/  {
+  method methodWithDefaultImpl() → core::Object?
+    ;
+}
+abstract class TestFailure<A extends core::Object? = dynamic> extends self::Base /*isMixinDeclaration*/  {
+  @core::override
+  abstract method methodWithDefaultImpl({covariant-by-class self::TestFailure::A? nameParam}) → core::Object?;
+}
+static method main() → void
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///issue48242.dart:10:4 -> InstanceConstant(const _Override{})
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/general/issue48242.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue48242.dart.weak.transformed.expect
new file mode 100644
index 0000000..679b8d1
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48242.dart.weak.transformed.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Base extends core::Object /*isMixinDeclaration*/  {
+  method methodWithDefaultImpl() → core::Object? {}
+}
+abstract class TestFailure<A extends core::Object? = dynamic> extends self::Base /*isMixinDeclaration*/  {
+  @#C1
+  abstract method methodWithDefaultImpl({covariant-by-class self::TestFailure::A? nameParam = #C2}) → core::Object?;
+}
+static method main() → void {}
+
+constants  {
+  #C1 = core::_Override {}
+  #C2 = null
+}
diff --git a/pkg/front_end/testcases/general/issue_47541.dart b/pkg/front_end/testcases/general/issue_47541.dart
new file mode 100644
index 0000000..23b18a7
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47541.dart
@@ -0,0 +1,59 @@
+void main() {
+  a();
+  b();
+  c(42);
+  d(42);
+}
+
+void a() {
+  try {
+    ;
+  } catch (e) {
+    ;
+  } on Foo {
+    ;
+  }
+
+  on();
+}
+
+void b() {
+  try {
+    ;
+  } catch (e) {
+    ;
+  } on Foo {
+    ;
+  }
+
+  onX(e) {
+    ;
+  }
+  onX("");
+}
+
+void c(int on) {
+  try {
+    ;
+  } catch (e) {
+    ;
+  } on Foo {
+    ;
+  }
+  on = 42;
+}
+
+void d(int on) {
+  try {
+    ;
+  } catch (e) {
+    ;
+  } on Foo {
+    ;
+  }
+  on.toString();
+}
+
+void on() {}
+
+class Foo {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/general/issue_47541.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue_47541.dart.textual_outline.expect
new file mode 100644
index 0000000..ef29dd0
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47541.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+void main() {}
+void a() {}
+void b() {}
+void c(int on) {}
+void d(int on) {}
+void on() {}
+
+class Foo {}
diff --git a/pkg/front_end/testcases/general/issue_47541.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue_47541.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..1dc83da
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47541.dart.textual_outline_modelled.expect
@@ -0,0 +1,8 @@
+class Foo {}
+
+void a() {}
+void b() {}
+void c(int on) {}
+void d(int on) {}
+void main() {}
+void on() {}
diff --git a/pkg/front_end/testcases/general/issue_47541.dart.weak.expect b/pkg/front_end/testcases/general/issue_47541.dart.weak.expect
new file mode 100644
index 0000000..f57dd6f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47541.dart.weak.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
+static method main() → void {
+  self::a();
+  self::b();
+  self::c(42);
+  self::d(42);
+}
+static method a() → void {
+  try {
+    ;
+  }
+  on core::Object catch(final core::Object e) {
+    ;
+  }
+  on self::Foo catch(no-exception-var) {
+    ;
+  }
+  self::on();
+}
+static method b() → void {
+  try {
+    ;
+  }
+  on core::Object catch(final core::Object e) {
+    ;
+  }
+  on self::Foo catch(no-exception-var) {
+    ;
+  }
+  function onX(dynamic e) → Null {
+    ;
+  }
+  onX(""){(dynamic) → Null};
+}
+static method c(core::int on) → void {
+  try {
+    ;
+  }
+  on core::Object catch(final core::Object e) {
+    ;
+  }
+  on self::Foo catch(no-exception-var) {
+    ;
+  }
+  on = 42;
+}
+static method d(core::int on) → void {
+  try {
+    ;
+  }
+  on core::Object catch(final core::Object e) {
+    ;
+  }
+  on self::Foo catch(no-exception-var) {
+    ;
+  }
+  on.{core::int::toString}(){() → core::String};
+}
+static method on() → void {}
diff --git a/pkg/front_end/testcases/general/issue_47541.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue_47541.dart.weak.modular.expect
new file mode 100644
index 0000000..f57dd6f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47541.dart.weak.modular.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
+static method main() → void {
+  self::a();
+  self::b();
+  self::c(42);
+  self::d(42);
+}
+static method a() → void {
+  try {
+    ;
+  }
+  on core::Object catch(final core::Object e) {
+    ;
+  }
+  on self::Foo catch(no-exception-var) {
+    ;
+  }
+  self::on();
+}
+static method b() → void {
+  try {
+    ;
+  }
+  on core::Object catch(final core::Object e) {
+    ;
+  }
+  on self::Foo catch(no-exception-var) {
+    ;
+  }
+  function onX(dynamic e) → Null {
+    ;
+  }
+  onX(""){(dynamic) → Null};
+}
+static method c(core::int on) → void {
+  try {
+    ;
+  }
+  on core::Object catch(final core::Object e) {
+    ;
+  }
+  on self::Foo catch(no-exception-var) {
+    ;
+  }
+  on = 42;
+}
+static method d(core::int on) → void {
+  try {
+    ;
+  }
+  on core::Object catch(final core::Object e) {
+    ;
+  }
+  on self::Foo catch(no-exception-var) {
+    ;
+  }
+  on.{core::int::toString}(){() → core::String};
+}
+static method on() → void {}
diff --git a/pkg/front_end/testcases/general/issue_47541.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue_47541.dart.weak.outline.expect
new file mode 100644
index 0000000..8eaa23a
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47541.dart.weak.outline.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    ;
+}
+static method main() → void
+  ;
+static method a() → void
+  ;
+static method b() → void
+  ;
+static method c(core::int on) → void
+  ;
+static method d(core::int on) → void
+  ;
+static method on() → void
+  ;
diff --git a/pkg/front_end/testcases/general/issue_47541.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue_47541.dart.weak.transformed.expect
new file mode 100644
index 0000000..f57dd6f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue_47541.dart.weak.transformed.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
+static method main() → void {
+  self::a();
+  self::b();
+  self::c(42);
+  self::d(42);
+}
+static method a() → void {
+  try {
+    ;
+  }
+  on core::Object catch(final core::Object e) {
+    ;
+  }
+  on self::Foo catch(no-exception-var) {
+    ;
+  }
+  self::on();
+}
+static method b() → void {
+  try {
+    ;
+  }
+  on core::Object catch(final core::Object e) {
+    ;
+  }
+  on self::Foo catch(no-exception-var) {
+    ;
+  }
+  function onX(dynamic e) → Null {
+    ;
+  }
+  onX(""){(dynamic) → Null};
+}
+static method c(core::int on) → void {
+  try {
+    ;
+  }
+  on core::Object catch(final core::Object e) {
+    ;
+  }
+  on self::Foo catch(no-exception-var) {
+    ;
+  }
+  on = 42;
+}
+static method d(core::int on) → void {
+  try {
+    ;
+  }
+  on core::Object catch(final core::Object e) {
+    ;
+  }
+  on self::Foo catch(no-exception-var) {
+    ;
+  }
+  on.{core::int::toString}(){() → core::String};
+}
+static method on() → void {}
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.expect
index f42bd18..930818a 100644
--- a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.expect
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.expect
@@ -2,6 +2,10 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:15: Error: A constant constructor can't call a non-constant super constructor.
+//   const B() : super();
+//               ^
+//
 // pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Error: Too few positional arguments: 1 required, 0 given.
 //   const B() : super();
 //                    ^
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.modular.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.modular.expect
index f42bd18..930818a 100644
--- a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.modular.expect
@@ -2,6 +2,10 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:15: Error: A constant constructor can't call a non-constant super constructor.
+//   const B() : super();
+//               ^
+//
 // pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Error: Too few positional arguments: 1 required, 0 given.
 //   const B() : super();
 //                    ^
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.outline.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.outline.expect
index 8ebaafe..2bbebbe 100644
--- a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.outline.expect
@@ -2,6 +2,10 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:15: Error: A constant constructor can't call a non-constant super constructor.
+//   const B() : super();
+//               ^
+//
 // pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Error: Too few positional arguments: 1 required, 0 given.
 //   const B() : super();
 //                    ^
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.transformed.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.transformed.expect
index f42bd18..930818a 100644
--- a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.weak.transformed.expect
@@ -2,6 +2,10 @@
 //
 // Problems in library:
 //
+// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:15: Error: A constant constructor can't call a non-constant super constructor.
+//   const B() : super();
+//               ^
+//
 // pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Error: Too few positional arguments: 1 required, 0 given.
 //   const B() : super();
 //                    ^
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index ca04916..5c09d8e 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -28,12 +28,14 @@
 constructor_tearoffs/new_as_selector: FormatterCrash
 dart2js/late_fields: FormatterCrash
 dart2js/late_statics: FormatterCrash
+enhanced_enums/constructor_calls: FormatterCrash
 enhanced_enums/entries_with_type_arguments: FormatterCrash
 enhanced_enums/enum_as_supertype: FormatterCrash
 enhanced_enums/inference_in_constructor_parameters: FormatterCrash
 enhanced_enums/instantiated_generic_enum_types: FormatterCrash
 enhanced_enums/issue48084: FormatterCrash
 enhanced_enums/issue48181: FormatterCrash
+enhanced_enums/malformed_constructors: FormatterCrash
 enhanced_enums/members: FormatterCrash
 enhanced_enums/named_arguments: FormatterCrash
 enhanced_enums/qualified_names_with_no_type_arguments: FormatterCrash
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index f75594a..3a8704e 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -12,9 +12,10 @@
 dart2js/mixin_from_opt_in/main: SemiFuzzFailure
 dart2js/mixin_from_opt_in/main.no_link: SemiFuzzFailure
 general/error_recovery/issue_39058_prime.crash: SemiFuzzFailure
-general/error_recovery/issue_39202.crash: SemiFuzzCrash
 general/error_recovery/issue_39058.crash: SemiFuzzFailure
+general/error_recovery/issue_39202.crash: SemiFuzzCrash
 general/platform_invalid_uris/main: SemiFuzzFailure
+general/supported_libraries/main: SemiFuzzFailure
 nnbd_mixed/mixin_from_opt_in/main: SemiFuzzFailure
 nnbd_mixed/mixin_from_opt_in/main.no_link: SemiFuzzFailure
 regress/utf_16_le_content.crash: SemiFuzzCrash
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index 8da2940..df0c74e 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -343,7 +343,7 @@
   }
 
   @override
-  List<InterfaceType> getClassInterfaces(ClassElementImpl element) {
+  List<InterfaceType> getClassInterfaces(AbstractClassElementImpl element) {
     return _wrapExceptions(
         _fixBuilder!.unit,
         () => element.interfacesInternal,
diff --git a/pkg/vm_snapshot_analysis/CHANGELOG.md b/pkg/vm_snapshot_analysis/CHANGELOG.md
index 9da6e6a1..f931fce 100644
--- a/pkg/vm_snapshot_analysis/CHANGELOG.md
+++ b/pkg/vm_snapshot_analysis/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Changelog
 
+## 0.7.1
+
+- Make `CallGraphNode.dominator` nullable.
+
 ## 0.7.0
 
 - Migrate to null-safety.
diff --git a/pkg/vm_snapshot_analysis/lib/precompiler_trace.dart b/pkg/vm_snapshot_analysis/lib/precompiler_trace.dart
index 06e8076..49fe928 100644
--- a/pkg/vm_snapshot_analysis/lib/precompiler_trace.dart
+++ b/pkg/vm_snapshot_analysis/lib/precompiler_trace.dart
@@ -39,7 +39,7 @@
   /// Dominator of this node.
   ///
   /// Computed by [CallGraph.computeDominators].
-  late CallGraphNode dominator;
+  CallGraphNode? dominator;
 
   /// Nodes dominated by this node.
   ///
diff --git a/pkg/vm_snapshot_analysis/pubspec.yaml b/pkg/vm_snapshot_analysis/pubspec.yaml
index cf8bed0..45627e6 100644
--- a/pkg/vm_snapshot_analysis/pubspec.yaml
+++ b/pkg/vm_snapshot_analysis/pubspec.yaml
@@ -1,6 +1,6 @@
 name: vm_snapshot_analysis
 description: Utilities for analysing AOT snapshot size.
-version: 0.7.0
+version: 0.7.1
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_snapshot_analysis
 
diff --git a/pkg/vm_snapshot_analysis/test/precompiler_trace_test.dart b/pkg/vm_snapshot_analysis/test/precompiler_trace_test.dart
index f00e977..4301155 100644
--- a/pkg/vm_snapshot_analysis/test/precompiler_trace_test.dart
+++ b/pkg/vm_snapshot_analysis/test/precompiler_trace_test.dart
@@ -103,6 +103,7 @@
     test('collapse-by-package', () async {
       await withFlag(testSource, '--trace_precompiler_to', (json) async {
         final jsonRaw = await loadJson(File(json));
+
         final callGraph = loadTrace(jsonRaw).collapse(NodeType.packageNode);
 
         // Collapsing by package should not collapse dart:* libraries into root
@@ -110,5 +111,15 @@
         expect(callGraph.root.pred, isEmpty);
       });
     });
+
+    test('root-dominator-is-null', () async {
+      await withFlag(testSource, '--trace_precompiler_to', (json) async {
+        final jsonRaw = await loadJson(File(json));
+
+        final callGraph = loadTrace(jsonRaw).collapse(NodeType.classNode);
+
+        expect(callGraph.root.dominator, isNull);
+      });
+    });
   });
 }
diff --git a/runtime/docs/infra/coredumps.md b/runtime/docs/infra/coredumps.md
index 3e1e2d5..a35d924 100644
--- a/runtime/docs/infra/coredumps.md
+++ b/runtime/docs/infra/coredumps.md
@@ -45,11 +45,25 @@
 
 ![shard isolate out](images/isolated-out-link.png)
 
-This link would bring you to isolate server file browser where you will be
-able to download archived artifacts.
+This link would bring you to isolate server file browser where you can see the artifacts you can download.
 
 ![Isolate Server Browser](images/isolated-out-browser.png)
 
+One caveat is that file browser might fail to download large files, so you might need to use `cas` tool if you need to download those.
+
+`cas` tool is installed using `cipd`:
+```
+cipd install "infra/tools/luci/cas/\${platform}" -root ~/cas_tool
+```
+
+Then you point `cas` at digest hash for the directory to be downloaded:
+
+```
+~/cas_tool/cas download -cas-instance projects/chromium-swarm/instances/default_instance -digest <digest_hash> -dir downloaded
+```
+
+where `<digest_hash>` is 'Digest' value from the isolate server browser listing.
+
 ### Cloud Storage
 
 Other bots upload collected artifacts into a `dart-temp-crash-archive` Cloud Storage bucket. In this case you will see
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 41c46cf..aeb4640 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -631,9 +631,7 @@
   // The shadow call stack register will be restored by the JumpToFrame stub.
 #endif
 
-  // TODO(b/209838275): Re-enable this once g3 build rules for gen_snapshot are
-  // working with TSAN.
-#if 0  // defined(USING_THREAD_SANITIZER)
+#if defined(USING_THREAD_SANITIZER)
   if (thread->exit_through_ffi() == Thread::kExitThroughRuntimeCall) {
     auto tsan_utils = thread->tsan_utils();
     tsan_utils->exception_pc = program_counter;
diff --git a/sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart b/sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart
index bd8533a..4053525 100644
--- a/sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart
+++ b/sdk/lib/_internal/js_runtime/lib/linked_hash_map.dart
@@ -218,7 +218,7 @@
     // always unboxed (Smi) values. Modification detection will be missed if you
     // make exactly some multiple of 2^30 modifications between advances of an
     // iterator.
-    _modifications = (_modifications + 1) & 0x3ffffff;
+    _modifications = (_modifications + 1) & 0x3fffffff;
   }
 
   // Create a new cell and link it in as the last one in the list.
@@ -264,14 +264,14 @@
     // Only treat unsigned 30-bit integers as numeric keys. This way,
     // we avoid converting them to strings when we use them as keys in
     // the JavaScript hash table object.
-    return key is num && JS('bool', '(# & 0x3ffffff) === #', key, key);
+    return key is num && JS('bool', '(# & 0x3fffffff) === #', key, key);
   }
 
   int internalComputeHashCode(var key) {
     // We force the hash codes to be unsigned 30-bit integers to avoid
     // issues with problematic keys like '__proto__'. Another option
     // would be to throw an exception if the hash code isn't a number.
-    return JS('int', '# & 0x3ffffff', key.hashCode);
+    return JS('int', '# & 0x3fffffff', key.hashCode);
   }
 
   List<LinkedHashMapCell>? _getBucket(var table, var key) {
diff --git a/sdk/lib/js_util/js_util.dart b/sdk/lib/js_util/js_util.dart
index fcd668c..5dca72d 100644
--- a/sdk/lib/js_util/js_util.dart
+++ b/sdk/lib/js_util/js_util.dart
@@ -68,7 +68,8 @@
 
 bool hasProperty(Object o, Object name) => JS('bool', '# in #', name, o);
 
-T getProperty<T>(Object o, Object name) => JS('Object|Null', '#[#]', o, name);
+T getProperty<T>(Object o, Object name) =>
+    JS<dynamic>('Object|Null', '#[#]', o, name);
 
 // A CFE transformation may optimize calls to `setProperty`, when [value] is
 // statically known to be a non-function.
@@ -88,40 +89,41 @@
 // statically known to be non-functions.
 T callMethod<T>(Object o, String method, List<Object?> args) {
   assertInteropArgs(args);
-  return JS('Object|Null', '#[#].apply(#, #)', o, method, o, args);
+  return JS<dynamic>('Object|Null', '#[#].apply(#, #)', o, method, o, args);
 }
 
 /// Unchecked version for 0 arguments, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
 T _callMethodUnchecked0<T>(Object o, String method) {
-  return JS('Object|Null', '#[#]()', o, method);
+  return JS<dynamic>('Object|Null', '#[#]()', o, method);
 }
 
 /// Unchecked version for 1 argument, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
 T _callMethodUnchecked1<T>(Object o, String method, Object? arg1) {
-  return JS('Object|Null', '#[#](#)', o, method, arg1);
+  return JS<dynamic>('Object|Null', '#[#](#)', o, method, arg1);
 }
 
 /// Unchecked version for 2 arguments, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
 T _callMethodUnchecked2<T>(
     Object o, String method, Object? arg1, Object? arg2) {
-  return JS('Object|Null', '#[#](#, #)', o, method, arg1, arg2);
+  return JS<dynamic>('Object|Null', '#[#](#, #)', o, method, arg1, arg2);
 }
 
 /// Unchecked version for 3 arguments, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
 T _callMethodUnchecked3<T>(
     Object o, String method, Object? arg1, Object? arg2, Object? arg3) {
-  return JS('Object|Null', '#[#](#, #, #)', o, method, arg1, arg2, arg3);
+  return JS<dynamic>(
+      'Object|Null', '#[#](#, #, #)', o, method, arg1, arg2, arg3);
 }
 
 /// Unchecked version for 4 arguments, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
 T _callMethodUnchecked4<T>(Object o, String method, Object? arg1, Object? arg2,
     Object? arg3, Object? arg4) {
-  return JS(
+  return JS<dynamic>(
       'Object|Null', '#[#](#, #, #, #)', o, method, arg1, arg2, arg3, arg4);
 }
 
@@ -134,7 +136,7 @@
 
 T callConstructor<T>(Object constr, List<Object?>? arguments) {
   if (arguments == null) {
-    return JS('Object', 'new #()', constr);
+    return JS<dynamic>('Object', 'new #()', constr);
   } else {
     assertInteropArgs(arguments);
   }
@@ -143,29 +145,30 @@
     int argumentCount = JS('int', '#.length', arguments);
     switch (argumentCount) {
       case 0:
-        return JS('Object', 'new #()', constr);
+        return JS<dynamic>('Object', 'new #()', constr);
 
       case 1:
         var arg0 = JS('', '#[0]', arguments);
-        return JS('Object', 'new #(#)', constr, arg0);
+        return JS<dynamic>('Object', 'new #(#)', constr, arg0);
 
       case 2:
         var arg0 = JS('', '#[0]', arguments);
         var arg1 = JS('', '#[1]', arguments);
-        return JS('Object', 'new #(#, #)', constr, arg0, arg1);
+        return JS<dynamic>('Object', 'new #(#, #)', constr, arg0, arg1);
 
       case 3:
         var arg0 = JS('', '#[0]', arguments);
         var arg1 = JS('', '#[1]', arguments);
         var arg2 = JS('', '#[2]', arguments);
-        return JS('Object', 'new #(#, #, #)', constr, arg0, arg1, arg2);
+        return JS<dynamic>(
+            'Object', 'new #(#, #, #)', constr, arg0, arg1, arg2);
 
       case 4:
         var arg0 = JS('', '#[0]', arguments);
         var arg1 = JS('', '#[1]', arguments);
         var arg2 = JS('', '#[2]', arguments);
         var arg3 = JS('', '#[3]', arguments);
-        return JS(
+        return JS<dynamic>(
             'Object', 'new #(#, #, #, #)', constr, arg0, arg1, arg2, arg3);
     }
   }
@@ -183,7 +186,7 @@
   JS('String', 'String(#)', factoryFunction);
   // This could return an UnknownJavaScriptObject, or a native
   // object for which there is an interceptor
-  return JS('Object', 'new #()', factoryFunction);
+  return JS<dynamic>('Object', 'new #()', factoryFunction);
 
   // TODO(sra): Investigate:
   //
@@ -196,33 +199,34 @@
 /// Unchecked version for 0 arguments, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
 T _callConstructorUnchecked0<T>(Object constr) {
-  return JS('Object', 'new #()', constr);
+  return JS<dynamic>('Object', 'new #()', constr);
 }
 
 /// Unchecked version for 1 argument, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
 T _callConstructorUnchecked1<T>(Object constr, Object? arg1) {
-  return JS('Object', 'new #(#)', constr, arg1);
+  return JS<dynamic>('Object', 'new #(#)', constr, arg1);
 }
 
 /// Unchecked version for 2 arguments, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
 T _callConstructorUnchecked2<T>(Object constr, Object? arg1, Object? arg2) {
-  return JS('Object', 'new #(#, #)', constr, arg1, arg2);
+  return JS<dynamic>('Object', 'new #(#, #)', constr, arg1, arg2);
 }
 
 /// Unchecked version for 3 arguments, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
 T _callConstructorUnchecked3<T>(
     Object constr, Object? arg1, Object? arg2, Object? arg3) {
-  return JS('Object', 'new #(#, #, #)', constr, arg1, arg2, arg3);
+  return JS<dynamic>('Object', 'new #(#, #, #)', constr, arg1, arg2, arg3);
 }
 
 /// Unchecked version for 4 arguments, only used in a CFE transformation.
 @pragma('dart2js:tryInline')
 T _callConstructorUnchecked4<T>(
     Object constr, Object? arg1, Object? arg2, Object? arg3, Object? arg4) {
-  return JS('Object', 'new #(#, #, #, #)', constr, arg1, arg2, arg3, arg4);
+  return JS<dynamic>(
+      'Object', 'new #(#, #, #, #)', constr, arg1, arg2, arg3, arg4);
 }
 
 /// Exception for when the promise is rejected with a `null` or `undefined`
diff --git a/tests/language/constructor/redirect2_test.dart b/tests/language/constructor/redirect2_test.dart
index 85fc234..a1d50be 100644
--- a/tests/language/constructor/redirect2_test.dart
+++ b/tests/language/constructor/redirect2_test.dart
@@ -31,11 +31,9 @@
   A.illegalSuper() : this(3), super(3);
   //                          ^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.SUPER_IN_REDIRECTING_CONSTRUCTOR
-  // [cfe] A redirecting constructor can't have other initializers.
+  // [cfe] A redirecting constructor can't have a 'super' initializer.
   //                                ^
   // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS
-  //                               ^^^
-  // [cfe] Too many positional arguments: 0 allowed, but 1 found.
 }
 
 main() {
diff --git a/tests/language_2/constructor/redirect2_test.dart b/tests/language_2/constructor/redirect2_test.dart
index 71aa1c3..39e5632 100644
--- a/tests/language_2/constructor/redirect2_test.dart
+++ b/tests/language_2/constructor/redirect2_test.dart
@@ -33,11 +33,9 @@
   A.illegalSuper() : this(3), super(3);
   //                          ^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.SUPER_IN_REDIRECTING_CONSTRUCTOR
-  // [cfe] A redirecting constructor can't have other initializers.
+  // [cfe] A redirecting constructor can't have a 'super' initializer.
   //                                ^
   // [analyzer] COMPILE_TIME_ERROR.EXTRA_POSITIONAL_ARGUMENTS
-  //                               ^^^
-  // [cfe] Too many positional arguments: 0 allowed, but 1 found.
 }
 
 main() {
diff --git a/tests/lib/js/js_util/implicit_downcast_test.dart b/tests/lib/js/js_util/implicit_downcast_test.dart
new file mode 100644
index 0000000..b0d201b
--- /dev/null
+++ b/tests/lib/js/js_util/implicit_downcast_test.dart
@@ -0,0 +1,124 @@
+// 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.
+
+// Tests implicit downcasts in js_util.
+
+@JS()
+library js_util_implicit_downcast_test;
+
+import 'package:js/js.dart';
+import 'package:js/js_util.dart' as js_util;
+import 'package:expect/minitest.dart';
+
+@JS()
+external void eval(String code);
+
+@JS()
+class Foo {
+  external Foo(num a);
+
+  external num get a;
+  external void set a(_);
+  external num bar();
+}
+
+bool isComplianceMode() {
+  var stuff = [1, 'string'];
+  var a = stuff[0];
+  // Detect whether we are using --omit-implicit-checks.
+  try {
+    String s = a as dynamic;
+    return false;
+  } catch (e) {
+    // Ignore.
+  }
+  return true;
+}
+
+main() {
+  eval(r"""
+    function Foo(a) {
+      this.a = a;
+    }
+
+    Foo.prototype.bar = function() {
+      return this.a;
+    }
+    """);
+
+  if (isComplianceMode()) {
+    complianceModeTest();
+  } else {
+    omitImplicitChecksTest();
+  }
+}
+
+complianceModeTest() {
+  var f = Foo(42);
+  expect(js_util.getProperty<int>(f, 'a'), equals(42));
+  expect(() => js_util.getProperty<List>(f, 'a'), throws);
+
+  f.a = 5;
+  expect(js_util.callMethod<int>(f, 'bar', []), equals(5));
+  expect(() => js_util.callMethod<List>(f, 'bar', []), throws);
+
+  // Check optimized lowering of callMethod.
+  expect(() => js_util.callMethod<List>(f, 'bar', [1]), throws);
+  expect(() => js_util.callMethod<List>(f, 'bar', [1, 2]), throws);
+  expect(() => js_util.callMethod<List>(f, 'bar', [1, 2, 3]), throws);
+  expect(() => js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4]), throws);
+  expect(() => js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4, 5]), throws);
+
+  var f2 = Foo(7);
+  var fConstructor = js_util.getProperty(f, 'constructor');
+  expect(js_util.callConstructor<Foo>(fConstructor, [7]).a, equals(7));
+  expect(() => js_util.callConstructor<List>(fConstructor, [7]), throws);
+
+  // Check optimized lowering of callConstructor.
+  expect(() => js_util.callConstructor<List>(fConstructor, null), throws);
+  expect(() => js_util.callConstructor<List>(fConstructor, []), throws);
+  expect(() => js_util.callConstructor<List>(fConstructor, [1, 2]), throws);
+  expect(() => js_util.callConstructor<List>(fConstructor, [1, 2, 3]), throws);
+  expect(
+      () => js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4]), throws);
+  expect(() => js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4, 5]),
+      throws);
+}
+
+omitImplicitChecksTest() {
+  var f = Foo(42);
+  expect(js_util.getProperty<int>(f, 'a'), equals(42));
+  expect(js_util.getProperty<List>(f, 'a'), equals(42));
+
+  f.a = 5;
+  expect(js_util.callMethod<int>(f, 'bar', []), equals(5));
+  expect(js_util.callMethod<List>(f, 'bar', []), equals(5));
+
+  // Check optimized lowering of callMethod.
+  expect(js_util.callMethod<List>(f, 'bar', [1]), equals(5));
+  expect(js_util.callMethod<List>(f, 'bar', [1, 2]), equals(5));
+  expect(js_util.callMethod<List>(f, 'bar', [1, 2, 3]), equals(5));
+  expect(js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4]), equals(5));
+  expect(js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4, 5]), equals(5));
+
+  var fConstructor = js_util.getProperty(f, 'constructor');
+  expect(js_util.callConstructor<Foo>(fConstructor, [7]).a, equals(7));
+  expect(
+      (js_util.callConstructor<List>(fConstructor, [7]) as Foo).a, equals(7));
+
+  // Check optimized lowering of callConstructor.
+  expect((js_util.callConstructor<List>(fConstructor, null) as Foo).a,
+      equals(null));
+  expect(
+      (js_util.callConstructor<List>(fConstructor, []) as Foo).a, equals(null));
+  expect((js_util.callConstructor<List>(fConstructor, [1, 2]) as Foo).a,
+      equals(1));
+  expect((js_util.callConstructor<List>(fConstructor, [1, 2, 3]) as Foo).a,
+      equals(1));
+  expect((js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4]) as Foo).a,
+      equals(1));
+  expect(
+      (js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4, 5]) as Foo).a,
+      equals(1));
+}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 46bdedf..ae16628 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -45,6 +45,7 @@
 js/instanceof_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
 js/is_check_and_as_cast_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
 js/js_util/async_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
+js/js_util/implicit_downcast_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
 js/js_util/javascriptobject_extensions_test.dart: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
 js/js_util/jsify_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
 js/js_util/promise_reject_null_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
diff --git a/tests/lib_2/js/js_util/implicit_downcast_test.dart b/tests/lib_2/js/js_util/implicit_downcast_test.dart
new file mode 100644
index 0000000..b0d201b
--- /dev/null
+++ b/tests/lib_2/js/js_util/implicit_downcast_test.dart
@@ -0,0 +1,124 @@
+// 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.
+
+// Tests implicit downcasts in js_util.
+
+@JS()
+library js_util_implicit_downcast_test;
+
+import 'package:js/js.dart';
+import 'package:js/js_util.dart' as js_util;
+import 'package:expect/minitest.dart';
+
+@JS()
+external void eval(String code);
+
+@JS()
+class Foo {
+  external Foo(num a);
+
+  external num get a;
+  external void set a(_);
+  external num bar();
+}
+
+bool isComplianceMode() {
+  var stuff = [1, 'string'];
+  var a = stuff[0];
+  // Detect whether we are using --omit-implicit-checks.
+  try {
+    String s = a as dynamic;
+    return false;
+  } catch (e) {
+    // Ignore.
+  }
+  return true;
+}
+
+main() {
+  eval(r"""
+    function Foo(a) {
+      this.a = a;
+    }
+
+    Foo.prototype.bar = function() {
+      return this.a;
+    }
+    """);
+
+  if (isComplianceMode()) {
+    complianceModeTest();
+  } else {
+    omitImplicitChecksTest();
+  }
+}
+
+complianceModeTest() {
+  var f = Foo(42);
+  expect(js_util.getProperty<int>(f, 'a'), equals(42));
+  expect(() => js_util.getProperty<List>(f, 'a'), throws);
+
+  f.a = 5;
+  expect(js_util.callMethod<int>(f, 'bar', []), equals(5));
+  expect(() => js_util.callMethod<List>(f, 'bar', []), throws);
+
+  // Check optimized lowering of callMethod.
+  expect(() => js_util.callMethod<List>(f, 'bar', [1]), throws);
+  expect(() => js_util.callMethod<List>(f, 'bar', [1, 2]), throws);
+  expect(() => js_util.callMethod<List>(f, 'bar', [1, 2, 3]), throws);
+  expect(() => js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4]), throws);
+  expect(() => js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4, 5]), throws);
+
+  var f2 = Foo(7);
+  var fConstructor = js_util.getProperty(f, 'constructor');
+  expect(js_util.callConstructor<Foo>(fConstructor, [7]).a, equals(7));
+  expect(() => js_util.callConstructor<List>(fConstructor, [7]), throws);
+
+  // Check optimized lowering of callConstructor.
+  expect(() => js_util.callConstructor<List>(fConstructor, null), throws);
+  expect(() => js_util.callConstructor<List>(fConstructor, []), throws);
+  expect(() => js_util.callConstructor<List>(fConstructor, [1, 2]), throws);
+  expect(() => js_util.callConstructor<List>(fConstructor, [1, 2, 3]), throws);
+  expect(
+      () => js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4]), throws);
+  expect(() => js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4, 5]),
+      throws);
+}
+
+omitImplicitChecksTest() {
+  var f = Foo(42);
+  expect(js_util.getProperty<int>(f, 'a'), equals(42));
+  expect(js_util.getProperty<List>(f, 'a'), equals(42));
+
+  f.a = 5;
+  expect(js_util.callMethod<int>(f, 'bar', []), equals(5));
+  expect(js_util.callMethod<List>(f, 'bar', []), equals(5));
+
+  // Check optimized lowering of callMethod.
+  expect(js_util.callMethod<List>(f, 'bar', [1]), equals(5));
+  expect(js_util.callMethod<List>(f, 'bar', [1, 2]), equals(5));
+  expect(js_util.callMethod<List>(f, 'bar', [1, 2, 3]), equals(5));
+  expect(js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4]), equals(5));
+  expect(js_util.callMethod<List>(f, 'bar', [1, 2, 3, 4, 5]), equals(5));
+
+  var fConstructor = js_util.getProperty(f, 'constructor');
+  expect(js_util.callConstructor<Foo>(fConstructor, [7]).a, equals(7));
+  expect(
+      (js_util.callConstructor<List>(fConstructor, [7]) as Foo).a, equals(7));
+
+  // Check optimized lowering of callConstructor.
+  expect((js_util.callConstructor<List>(fConstructor, null) as Foo).a,
+      equals(null));
+  expect(
+      (js_util.callConstructor<List>(fConstructor, []) as Foo).a, equals(null));
+  expect((js_util.callConstructor<List>(fConstructor, [1, 2]) as Foo).a,
+      equals(1));
+  expect((js_util.callConstructor<List>(fConstructor, [1, 2, 3]) as Foo).a,
+      equals(1));
+  expect((js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4]) as Foo).a,
+      equals(1));
+  expect(
+      (js_util.callConstructor<List>(fConstructor, [1, 2, 3, 4, 5]) as Foo).a,
+      equals(1));
+}
diff --git a/tests/lib_2/lib_2.status b/tests/lib_2/lib_2.status
index bef1d69..fbaf7af 100644
--- a/tests/lib_2/lib_2.status
+++ b/tests/lib_2/lib_2.status
@@ -45,6 +45,7 @@
 js/instanceof_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
 js/is_check_and_as_cast_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
 js/js_util/async_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
+js/js_util/implicit_downcast_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
 js/js_util/javascriptobject_extensions_test.dart: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
 js/js_util/jsify_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
 js/js_util/promise_reject_null_test: SkipByDesign # Issue 42085. CSP policy disallows injected JS code
diff --git a/tools/VERSION b/tools/VERSION
index d2fe2b3..bdc251a 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 71
+PRERELEASE 72
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/linux_dist_support/linux_distribution_support.py b/tools/linux_dist_support/linux_distribution_support.py
index b7c5529..cb739d4 100644
--- a/tools/linux_dist_support/linux_distribution_support.py
+++ b/tools/linux_dist_support/linux_distribution_support.py
@@ -52,9 +52,7 @@
 
 
 def TestInstallation(assume_installed=True):
-    paths = ['/usr/bin/dart']
-    for tool in ['dart2js', 'pub', 'dart', 'dartanalyzer']:
-        paths.append(os.path.join('/usr/lib/dart/bin', tool))
+    paths = ['/usr/bin/dart', '/usr/lib/dart/bin/dart']
     for path in paths:
         if os.path.exists(path):
             if not assume_installed:
@@ -100,7 +98,7 @@
     ])
 
     if os.path.exists('/usr/bin/dart') or os.path.exists(
-            '/usr/lib/dart/bin/dart2js'):
+            '/usr/lib/dart/bin/dart'):
         print("Dart already installed, removing")
         UninstallDart()
     TestInstallation(assume_installed=False)
@@ -118,11 +116,11 @@
     # run as root)
     Run(['cp', '/usr/bin/dart', 'out/ReleaseX64/dart'])
 
-    # Sanity check dart2js and the analyzer against a hello world program
+    # Check dart, dart compile js, and dart analyze against a hello world program
     with utils.TempDir() as temp_dir:
         test_file = CreateDartTestFile(temp_dir)
-        Run(['/usr/lib/dart/bin/dart2js', test_file])
-        Run(['/usr/lib/dart/bin/dartanalyzer', test_file])
+        Run(['/usr/lib/dart/bin/dart', 'compile', 'js', test_file])
+        Run(['/usr/lib/dart/bin/dart', 'analyze', test_file])
         Run(['/usr/lib/dart/bin/dart', test_file])
 
     UninstallDart()