diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart
index ca0f816..5866409 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart
@@ -39,14 +39,16 @@
 class Message {
   final Code<dynamic> code;
 
-  final String message;
+  final String problemMessage;
 
-  final String? tip;
+  final String? correctionMessage;
 
   final Map<String, dynamic> arguments;
 
   const Message(this.code,
-      {required this.message, this.tip, this.arguments = const {}});
+      {this.correctionMessage,
+      required this.problemMessage,
+      this.arguments = const {}});
 
   LocatedMessage withLocation(Uri uri, int charOffset, int length) {
     return new LocatedMessage(uri, charOffset, length, this);
@@ -57,21 +59,21 @@
   }
 
   String toString() {
-    return "Message[$code, $message, $tip, $arguments]";
+    return "Message[$code, $problemMessage, $correctionMessage, $arguments]";
   }
 }
 
 class MessageCode extends Code<Null> implements Message {
-  final String message;
+  final String problemMessage;
 
-  final String? tip;
+  final String? correctionMessage;
 
   const MessageCode(String name,
       {int index: -1,
       List<String>? analyzerCodes,
       Severity severity: Severity.error,
-      required this.message,
-      this.tip})
+      required this.problemMessage,
+      this.correctionMessage})
       : super(name,
             index: index, analyzerCodes: analyzerCodes, severity: severity);
 
@@ -90,15 +92,15 @@
 }
 
 class Template<T> {
-  final String messageTemplate;
+  final String problemMessageTemplate;
 
-  final String? tipTemplate;
+  final String? correctionMessageTemplate;
 
   final T withArguments;
 
   const Template(
-      {required this.messageTemplate,
-      this.tipTemplate,
+      {this.correctionMessageTemplate,
+      required this.problemMessageTemplate,
       required this.withArguments});
 }
 
@@ -116,9 +118,9 @@
 
   Code<dynamic> get code => messageObject.code;
 
-  String get message => messageObject.message;
+  String get problemMessage => messageObject.problemMessage;
 
-  String? get tip => messageObject.tip;
+  String? get correctionMessage => messageObject.correctionMessage;
 
   Map<String, dynamic> get arguments => messageObject.arguments;
 
@@ -128,7 +130,7 @@
     if (result != 0) return result;
     result = charOffset.compareTo(other.charOffset);
     if (result != 0) return result;
-    return message.compareTo(message);
+    return problemMessage.compareTo(problemMessage);
   }
 
   FormattedMessage withFormatting(PlainAndColorizedString formatted, int line,
@@ -209,9 +211,9 @@
 
   String get codeName => code.name;
 
-  String get message => locatedMessage.message;
+  String get problemMessage => locatedMessage.problemMessage;
 
-  String? get tip => locatedMessage.tip;
+  String? get correctionMessage => locatedMessage.correctionMessage;
 
   Map<String, dynamic> get arguments => locatedMessage.arguments;
 
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 f170c1f..0563d92 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -18,13 +18,13 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAbstractClassConstructorTearOff = const MessageCode(
     "AbstractClassConstructorTearOff",
-    message: r"""Constructors on abstract classes can't be torn off.""");
+    problemMessage: r"""Constructors on abstract classes can't be torn off.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateAbstractClassInstantiation =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The class '#name' is abstract and can't be instantiated.""",
         withArguments: _withArgumentsAbstractClassInstantiation);
 
@@ -38,7 +38,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeAbstractClassInstantiation,
-      message: """The class '${name}' is abstract and can't be instantiated.""",
+      problemMessage:
+          """The class '${name}' is abstract and can't be instantiated.""",
       arguments: {'name': name});
 }
 
@@ -49,8 +50,9 @@
 const MessageCode messageAbstractClassMember = const MessageCode(
     "AbstractClassMember",
     index: 51,
-    message: r"""Members of classes can't be declared to be 'abstract'.""",
-    tip:
+    problemMessage:
+        r"""Members of classes can't be declared to be 'abstract'.""",
+    correctionMessage:
         r"""Try removing the 'abstract' keyword. You can add the 'abstract' keyword before the class declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -59,8 +61,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAbstractExtensionField = const MessageCode(
     "AbstractExtensionField",
-    message: r"""Extension fields can't be declared 'abstract'.""",
-    tip: r"""Try removing the 'abstract' keyword.""");
+    problemMessage: r"""Extension fields can't be declared 'abstract'.""",
+    correctionMessage: r"""Try removing the 'abstract' keyword.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeAbstractExternalField = messageAbstractExternalField;
@@ -69,8 +71,10 @@
 const MessageCode messageAbstractExternalField = const MessageCode(
     "AbstractExternalField",
     index: 110,
-    message: r"""Fields can't be declared both 'abstract' and 'external'.""",
-    tip: r"""Try removing the 'abstract' or 'external' keyword.""");
+    problemMessage:
+        r"""Fields can't be declared both 'abstract' and 'external'.""",
+    correctionMessage:
+        r"""Try removing the 'abstract' or 'external' keyword.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeAbstractFieldConstructorInitializer =
@@ -79,8 +83,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAbstractFieldConstructorInitializer = const MessageCode(
     "AbstractFieldConstructorInitializer",
-    message: r"""Abstract fields cannot have initializers.""",
-    tip:
+    problemMessage: r"""Abstract fields cannot have initializers.""",
+    correctionMessage:
         r"""Try removing the field initializer or the 'abstract' keyword from the field declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -89,8 +93,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAbstractFieldInitializer = const MessageCode(
     "AbstractFieldInitializer",
-    message: r"""Abstract fields cannot have initializers.""",
-    tip: r"""Try removing the initializer or the 'abstract' keyword.""");
+    problemMessage: r"""Abstract fields cannot have initializers.""",
+    correctionMessage:
+        r"""Try removing the initializer or the 'abstract' keyword.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeAbstractLateField = messageAbstractLateField;
@@ -99,8 +104,8 @@
 const MessageCode messageAbstractLateField = const MessageCode(
     "AbstractLateField",
     index: 108,
-    message: r"""Abstract fields cannot be late.""",
-    tip: r"""Try removing the 'abstract' or 'late' keyword.""");
+    problemMessage: r"""Abstract fields cannot be late.""",
+    correctionMessage: r"""Try removing the 'abstract' or 'late' keyword.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeAbstractNotSync = messageAbstractNotSync;
@@ -108,7 +113,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAbstractNotSync = const MessageCode("AbstractNotSync",
     analyzerCodes: <String>["NON_SYNC_ABSTRACT_METHOD"],
-    message: r"""Abstract methods can't use 'async', 'async*', or 'sync*'.""");
+    problemMessage:
+        r"""Abstract methods can't use 'async', 'async*', or 'sync*'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -116,7 +122,7 @@
         String
             name)> templateAbstractRedirectedClassInstantiation = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Factory redirects to class '#name', which is abstract and can't be instantiated.""",
     withArguments: _withArgumentsAbstractRedirectedClassInstantiation);
 
@@ -132,7 +138,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeAbstractRedirectedClassInstantiation,
-      message:
+      problemMessage:
           """Factory redirects to class '${name}', which is abstract and can't be instantiated.""",
       arguments: {'name': name});
 }
@@ -144,13 +150,13 @@
 const MessageCode messageAbstractStaticField = const MessageCode(
     "AbstractStaticField",
     index: 107,
-    message: r"""Static fields can't be declared 'abstract'.""",
-    tip: r"""Try removing the 'abstract' or 'static' keyword.""");
+    problemMessage: r"""Static fields can't be declared 'abstract'.""",
+    correctionMessage: r"""Try removing the 'abstract' or 'static' keyword.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateAccessError =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Access error: '#name'.""",
+        problemMessageTemplate: r"""Access error: '#name'.""",
         withArguments: _withArgumentsAccessError);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -164,7 +170,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeAccessError,
-      message: """Access error: '${name}'.""", arguments: {'name': name});
+      problemMessage: """Access error: '${name}'.""",
+      arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -174,7 +181,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAgnosticWithStrongDillLibrary = const MessageCode(
     "AgnosticWithStrongDillLibrary",
-    message:
+    problemMessage:
         r"""Loaded library is compiled with sound null safety and cannot be used in compilation for agnostic null safety.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -184,7 +191,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAgnosticWithWeakDillLibrary = const MessageCode(
     "AgnosticWithWeakDillLibrary",
-    message:
+    problemMessage:
         r"""Loaded library is compiled with unsound null safety and cannot be used in compilation for agnostic null safety.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -194,7 +201,7 @@
 const MessageCode messageAmbiguousExtensionCause = const MessageCode(
     "AmbiguousExtensionCause",
     severity: Severity.context,
-    message: r"""This is one of the extension members.""");
+    problemMessage: r"""This is one of the extension members.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeAnnotationOnFunctionTypeTypeVariable =
@@ -203,7 +210,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAnnotationOnFunctionTypeTypeVariable =
     const MessageCode("AnnotationOnFunctionTypeTypeVariable",
-        message:
+        problemMessage:
             r"""A type variable on a function type can't have annotations.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -213,7 +220,7 @@
 const MessageCode messageAnnotationOnTypeArgument = const MessageCode(
     "AnnotationOnTypeArgument",
     index: 111,
-    message:
+    problemMessage:
         r"""Type arguments can't have annotations because they aren't declarations.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -222,9 +229,11 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAnonymousBreakTargetOutsideFunction =
-    const MessageCode("AnonymousBreakTargetOutsideFunction",
+    const MessageCode(
+        "AnonymousBreakTargetOutsideFunction",
         analyzerCodes: <String>["LABEL_IN_OUTER_SCOPE"],
-        message: r"""Can't break to a target in a different function.""");
+        problemMessage:
+            r"""Can't break to a target in a different function.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeAnonymousContinueTargetOutsideFunction =
@@ -232,9 +241,11 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAnonymousContinueTargetOutsideFunction =
-    const MessageCode("AnonymousContinueTargetOutsideFunction",
+    const MessageCode(
+        "AnonymousContinueTargetOutsideFunction",
         analyzerCodes: <String>["LABEL_IN_OUTER_SCOPE"],
-        message: r"""Can't continue at a target in a different function.""");
+        problemMessage:
+            r"""Can't continue at a target in a different function.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -242,7 +253,7 @@
         int
             codePoint)> templateAsciiControlCharacter = const Template<
         Message Function(int codePoint)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The control character #unicode can only be used in strings and comments.""",
     withArguments: _withArgumentsAsciiControlCharacter);
 
@@ -256,7 +267,7 @@
   String unicode =
       "U+${codePoint.toRadixString(16).toUpperCase().padLeft(4, '0')}";
   return new Message(codeAsciiControlCharacter,
-      message:
+      problemMessage:
           """The control character ${unicode} can only be used in strings and comments.""",
       arguments: {'unicode': codePoint});
 }
@@ -267,7 +278,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAssertAsExpression = const MessageCode(
     "AssertAsExpression",
-    message: r"""`assert` can't be used as an expression.""");
+    problemMessage: r"""`assert` can't be used as an expression.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeAssertExtraneousArgument = messageAssertExtraneousArgument;
@@ -275,7 +286,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAssertExtraneousArgument = const MessageCode(
     "AssertExtraneousArgument",
-    message: r"""`assert` can't have more than two arguments.""");
+    problemMessage: r"""`assert` can't have more than two arguments.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeAwaitAsIdentifier = messageAwaitAsIdentifier;
@@ -284,7 +295,7 @@
 const MessageCode messageAwaitAsIdentifier = const MessageCode(
     "AwaitAsIdentifier",
     analyzerCodes: <String>["ASYNC_KEYWORD_USED_AS_IDENTIFIER"],
-    message:
+    problemMessage:
         r"""'await' can't be used as an identifier in 'async', 'async*', or 'sync*' methods.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -294,9 +305,9 @@
 const MessageCode messageAwaitForNotAsync = const MessageCode(
     "AwaitForNotAsync",
     analyzerCodes: <String>["ASYNC_FOR_IN_WRONG_CONTEXT"],
-    message:
+    problemMessage:
         r"""The asynchronous for-in can only be used in functions marked with 'async' or 'async*'.""",
-    tip:
+    correctionMessage:
         r"""Try marking the function body with either 'async' or 'async*', or removing the 'await' before the for loop.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -306,7 +317,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAwaitInLateLocalInitializer = const MessageCode(
     "AwaitInLateLocalInitializer",
-    message:
+    problemMessage:
         r"""`await` expressions are not supported in late local initializers.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -315,7 +326,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageAwaitNotAsync = const MessageCode("AwaitNotAsync",
     analyzerCodes: <String>["AWAIT_IN_WRONG_CONTEXT"],
-    message: r"""'await' can only be used in 'async' or 'async*' methods.""");
+    problemMessage:
+        r"""'await' can only be used in 'async' or 'async*' methods.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -324,9 +336,9 @@
         String
             string2)> templateBinaryOperatorWrittenOut = const Template<
         Message Function(String string, String string2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Binary operator '#string' is written as '#string2' instead of the written out word.""",
-    tipTemplate: r"""Try replacing '#string' with '#string2'.""",
+    correctionMessageTemplate: r"""Try replacing '#string' with '#string2'.""",
     withArguments: _withArgumentsBinaryOperatorWrittenOut);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -341,9 +353,9 @@
   if (string.isEmpty) throw 'No string provided';
   if (string2.isEmpty) throw 'No string provided';
   return new Message(codeBinaryOperatorWrittenOut,
-      message:
+      problemMessage:
           """Binary operator '${string}' is written as '${string2}' instead of the written out word.""",
-      tip: """Try replacing '${string}' with '${string2}'.""",
+      correctionMessage: """Try replacing '${string}' with '${string2}'.""",
       arguments: {'string': string, 'string2': string2});
 }
 
@@ -353,11 +365,10 @@
         String name,
         String
             name2)> templateBoundIssueViaCycleNonSimplicity = const Template<
-        Message Function(String name,
-            String name2)>(
-    messageTemplate:
+        Message Function(String name, String name2)>(
+    problemMessageTemplate:
         r"""Generic type '#name' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through '#name2'.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try providing type arguments to '#name2' here or to some other raw types in the bounds along the reference chain.""",
     withArguments: _withArgumentsBoundIssueViaCycleNonSimplicity);
 
@@ -376,9 +387,9 @@
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   return new Message(codeBoundIssueViaCycleNonSimplicity,
-      message:
+      problemMessage:
           """Generic type '${name}' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through '${name2}'.""",
-      tip: """Try providing type arguments to '${name2}' here or to some other raw types in the bounds along the reference chain.""",
+      correctionMessage: """Try providing type arguments to '${name2}' here or to some other raw types in the bounds along the reference chain.""",
       arguments: {'name': name, 'name2': name2});
 }
 
@@ -387,10 +398,12 @@
     Message Function(
         String
             name)> templateBoundIssueViaLoopNonSimplicity = const Template<
-        Message Function(String name)>(
-    messageTemplate:
+        Message Function(
+            String name)>(
+    problemMessageTemplate:
         r"""Generic type '#name' can't be used without type arguments in the bounds of its own type variables.""",
-    tipTemplate: r"""Try providing type arguments to '#name' here.""",
+    correctionMessageTemplate:
+        r"""Try providing type arguments to '#name' here.""",
     withArguments: _withArgumentsBoundIssueViaLoopNonSimplicity);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -403,9 +416,9 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeBoundIssueViaLoopNonSimplicity,
-      message:
+      problemMessage:
           """Generic type '${name}' can't be used without type arguments in the bounds of its own type variables.""",
-      tip: """Try providing type arguments to '${name}' here.""",
+      correctionMessage: """Try providing type arguments to '${name}' here.""",
       arguments: {'name': name});
 }
 
@@ -413,9 +426,10 @@
 const Template<Message Function(String name)>
     templateBoundIssueViaRawTypeWithNonSimpleBounds =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Generic type '#name' can't be used without type arguments in a type variable bound.""",
-        tipTemplate: r"""Try providing type arguments to '#name' here.""",
+        correctionMessageTemplate:
+            r"""Try providing type arguments to '#name' here.""",
         withArguments: _withArgumentsBoundIssueViaRawTypeWithNonSimpleBounds);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -430,9 +444,9 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeBoundIssueViaRawTypeWithNonSimpleBounds,
-      message:
+      problemMessage:
           """Generic type '${name}' can't be used without type arguments in a type variable bound.""",
-      tip: """Try providing type arguments to '${name}' here.""",
+      correctionMessage: """Try providing type arguments to '${name}' here.""",
       arguments: {'name': name});
 }
 
@@ -443,15 +457,16 @@
 const MessageCode messageBreakOutsideOfLoop = const MessageCode(
     "BreakOutsideOfLoop",
     index: 52,
-    message:
+    problemMessage:
         r"""A break statement can't be used outside of a loop or switch statement.""",
-    tip: r"""Try removing the break statement.""");
+    correctionMessage: r"""Try removing the break statement.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateBreakTargetOutsideFunction =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Can't break to '#name' in a different function.""",
+        problemMessageTemplate:
+            r"""Can't break to '#name' in a different function.""",
         withArguments: _withArgumentsBreakTargetOutsideFunction);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -464,14 +479,14 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeBreakTargetOutsideFunction,
-      message: """Can't break to '${name}' in a different function.""",
+      problemMessage: """Can't break to '${name}' in a different function.""",
       arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateBuiltInIdentifierAsType =
     const Template<Message Function(Token token)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The built-in identifier '#lexeme' can't be used as a type.""",
         withArguments: _withArgumentsBuiltInIdentifierAsType);
 
@@ -484,7 +499,7 @@
 Message _withArgumentsBuiltInIdentifierAsType(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeBuiltInIdentifierAsType,
-      message:
+      problemMessage:
           """The built-in identifier '${lexeme}' can't be used as a type.""",
       arguments: {'lexeme': token});
 }
@@ -493,7 +508,7 @@
 const Template<Message Function(Token token)>
     templateBuiltInIdentifierInDeclaration =
     const Template<Message Function(Token token)>(
-        messageTemplate: r"""Can't use '#lexeme' as a name here.""",
+        problemMessageTemplate: r"""Can't use '#lexeme' as a name here.""",
         withArguments: _withArgumentsBuiltInIdentifierInDeclaration);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -505,7 +520,7 @@
 Message _withArgumentsBuiltInIdentifierInDeclaration(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeBuiltInIdentifierInDeclaration,
-      message: """Can't use '${lexeme}' as a name here.""",
+      problemMessage: """Can't use '${lexeme}' as a name here.""",
       arguments: {'lexeme': token});
 }
 
@@ -515,13 +530,14 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCandidateFound = const MessageCode("CandidateFound",
     severity: Severity.context,
-    message: r"""Found this candidate, but the arguments don't match.""");
+    problemMessage:
+        r"""Found this candidate, but the arguments don't match.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateCandidateFoundIsDefaultConstructor =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The class '#name' has a constructor that takes no arguments.""",
         withArguments: _withArgumentsCandidateFoundIsDefaultConstructor);
 
@@ -537,16 +553,17 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeCandidateFoundIsDefaultConstructor,
-      message:
+      problemMessage:
           """The class '${name}' has a constructor that takes no arguments.""",
       arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
-    templateCannotAssignToConstVariable =
+const Template<
+        Message Function(String name)> templateCannotAssignToConstVariable =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Can't assign to the const variable '#name'.""",
+        problemMessageTemplate:
+            r"""Can't assign to the const variable '#name'.""",
         withArguments: _withArgumentsCannotAssignToConstVariable);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -560,7 +577,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeCannotAssignToConstVariable,
-      message: """Can't assign to the const variable '${name}'.""",
+      problemMessage: """Can't assign to the const variable '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -571,13 +588,14 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCannotAssignToExtensionThis = const MessageCode(
     "CannotAssignToExtensionThis",
-    message: r"""Can't assign to 'this'.""");
+    problemMessage: r"""Can't assign to 'this'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
-    templateCannotAssignToFinalVariable =
+const Template<
+        Message Function(String name)> templateCannotAssignToFinalVariable =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Can't assign to the final variable '#name'.""",
+        problemMessageTemplate:
+            r"""Can't assign to the final variable '#name'.""",
         withArguments: _withArgumentsCannotAssignToFinalVariable);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -591,7 +609,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeCannotAssignToFinalVariable,
-      message: """Can't assign to the final variable '${name}'.""",
+      problemMessage: """Can't assign to the final variable '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -603,7 +621,7 @@
 const MessageCode messageCannotAssignToParenthesizedExpression =
     const MessageCode("CannotAssignToParenthesizedExpression",
         analyzerCodes: <String>["ASSIGNMENT_TO_PARENTHESIZED_EXPRESSION"],
-        message: r"""Can't assign to a parenthesized expression.""");
+        problemMessage: r"""Can't assign to a parenthesized expression.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeCannotAssignToSuper = messageCannotAssignToSuper;
@@ -612,7 +630,7 @@
 const MessageCode messageCannotAssignToSuper = const MessageCode(
     "CannotAssignToSuper",
     analyzerCodes: <String>["NOT_AN_LVALUE"],
-    message: r"""Can't assign to super.""");
+    problemMessage: r"""Can't assign to super.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeCannotAssignToTypeLiteral =
@@ -621,13 +639,13 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCannotAssignToTypeLiteral = const MessageCode(
     "CannotAssignToTypeLiteral",
-    message: r"""Can't assign to a type literal.""");
+    problemMessage: r"""Can't assign to a type literal.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string)>
     templateCannotReadSdkSpecification =
     const Template<Message Function(String string)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Unable to read the 'libraries.json' specification file:
   #string.""",
         withArguments: _withArgumentsCannotReadSdkSpecification);
@@ -642,7 +660,7 @@
 Message _withArgumentsCannotReadSdkSpecification(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeCannotReadSdkSpecification,
-      message: """Unable to read the 'libraries.json' specification file:
+      problemMessage: """Unable to read the 'libraries.json' specification file:
   ${string}.""", arguments: {'string': string});
 }
 
@@ -653,7 +671,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCantDisambiguateAmbiguousInformation = const MessageCode(
     "CantDisambiguateAmbiguousInformation",
-    message:
+    problemMessage:
         r"""Both Iterable and Map spread elements encountered in ambiguous literal.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -663,9 +681,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCantDisambiguateNotEnoughInformation = const MessageCode(
     "CantDisambiguateNotEnoughInformation",
-    message:
+    problemMessage:
         r"""Not enough type information to disambiguate between literal set and literal map.""",
-    tip:
+    correctionMessage:
         r"""Try providing type arguments for the literal explicitly to disambiguate it.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -675,8 +693,10 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCantInferPackagesFromManyInputs = const MessageCode(
     "CantInferPackagesFromManyInputs",
-    message: r"""Can't infer a packages file when compiling multiple inputs.""",
-    tip: r"""Try specifying the file explicitly with the --packages option.""");
+    problemMessage:
+        r"""Can't infer a packages file when compiling multiple inputs.""",
+    correctionMessage:
+        r"""Try specifying the file explicitly with the --packages option.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeCantInferPackagesFromPackageUri =
@@ -685,16 +705,18 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCantInferPackagesFromPackageUri = const MessageCode(
     "CantInferPackagesFromPackageUri",
-    message: r"""Can't infer a packages file from an input 'package:*' URI.""",
-    tip: r"""Try specifying the file explicitly with the --packages option.""");
+    problemMessage:
+        r"""Can't infer a packages file from an input 'package:*' URI.""",
+    correctionMessage:
+        r"""Try specifying the file explicitly with the --packages option.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateCantInferReturnTypeDueToNoCombinedSignature =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't infer a return type for '#name' as the overridden members don't have a combined signature.""",
-        tipTemplate: r"""Try adding an explicit type.""",
+        correctionMessageTemplate: r"""Try adding an explicit type.""",
         withArguments:
             _withArgumentsCantInferReturnTypeDueToNoCombinedSignature);
 
@@ -712,9 +734,9 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeCantInferReturnTypeDueToNoCombinedSignature,
-      message:
+      problemMessage:
           """Can't infer a return type for '${name}' as the overridden members don't have a combined signature.""",
-      tip: """Try adding an explicit type.""",
+      correctionMessage: """Try adding an explicit type.""",
       arguments: {'name': name});
 }
 
@@ -724,9 +746,9 @@
         String
             string)> templateCantInferTypeDueToCircularity = const Template<
         Message Function(String string)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Can't infer the type of '#string': circularity found during type inference.""",
-    tipTemplate: r"""Specify the type explicitly.""",
+    correctionMessageTemplate: r"""Specify the type explicitly.""",
     withArguments: _withArgumentsCantInferTypeDueToCircularity);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -738,9 +760,9 @@
 Message _withArgumentsCantInferTypeDueToCircularity(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeCantInferTypeDueToCircularity,
-      message:
+      problemMessage:
           """Can't infer the type of '${string}': circularity found during type inference.""",
-      tip: """Specify the type explicitly.""",
+      correctionMessage: """Specify the type explicitly.""",
       arguments: {'string': string});
 }
 
@@ -750,9 +772,9 @@
         String
             name)> templateCantInferTypeDueToNoCombinedSignature = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Can't infer a type for '#name' as the overridden members don't have a combined signature.""",
-    tipTemplate: r"""Try adding an explicit type.""",
+    correctionMessageTemplate: r"""Try adding an explicit type.""",
     withArguments: _withArgumentsCantInferTypeDueToNoCombinedSignature);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -769,9 +791,9 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeCantInferTypeDueToNoCombinedSignature,
-      message:
+      problemMessage:
           """Can't infer a type for '${name}' as the overridden members don't have a combined signature.""",
-      tip: """Try adding an explicit type.""",
+      correctionMessage: """Try adding an explicit type.""",
       arguments: {'name': name});
 }
 
@@ -781,9 +803,9 @@
         String
             name)> templateCantInferTypesDueToNoCombinedSignature = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Can't infer types for '#name' as the overridden members don't have a combined signature.""",
-    tipTemplate: r"""Try adding explicit types.""",
+    correctionMessageTemplate: r"""Try adding explicit types.""",
     withArguments: _withArgumentsCantInferTypesDueToNoCombinedSignature);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -800,16 +822,16 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeCantInferTypesDueToNoCombinedSignature,
-      message:
+      problemMessage:
           """Can't infer types for '${name}' as the overridden members don't have a combined signature.""",
-      tip: """Try adding explicit types.""",
+      correctionMessage: """Try adding explicit types.""",
       arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Uri uri_, String string)> templateCantReadFile =
     const Template<Message Function(Uri uri_, String string)>(
-        messageTemplate: r"""Error when reading '#uri': #string""",
+        problemMessageTemplate: r"""Error when reading '#uri': #string""",
         withArguments: _withArgumentsCantReadFile);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -822,7 +844,7 @@
   String? uri = relativizeUri(uri_);
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeCantReadFile,
-      message: """Error when reading '${uri}': ${string}""",
+      problemMessage: """Error when reading '${uri}': ${string}""",
       arguments: {'uri': uri_, 'string': string});
 }
 
@@ -830,7 +852,7 @@
 const Template<Message Function(Token token)>
     templateCantUseControlFlowOrSpreadAsConstant =
     const Template<Message Function(Token token)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""'#lexeme' is not supported in constant expressions.""",
         withArguments: _withArgumentsCantUseControlFlowOrSpreadAsConstant);
 
@@ -845,7 +867,8 @@
 Message _withArgumentsCantUseControlFlowOrSpreadAsConstant(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeCantUseControlFlowOrSpreadAsConstant,
-      message: """'${lexeme}' is not supported in constant expressions.""",
+      problemMessage:
+          """'${lexeme}' is not supported in constant expressions.""",
       arguments: {'lexeme': token});
 }
 
@@ -855,9 +878,9 @@
         Token
             token)> templateCantUseDeferredPrefixAsConstant = const Template<
         Message Function(Token token)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""'#lexeme' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try moving the constant from the deferred library, or removing 'deferred' from the import.
 """,
     withArguments: _withArgumentsCantUseDeferredPrefixAsConstant);
@@ -871,9 +894,9 @@
 Message _withArgumentsCantUseDeferredPrefixAsConstant(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeCantUseDeferredPrefixAsConstant,
-      message:
+      problemMessage:
           """'${lexeme}' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.""",
-      tip: """Try moving the constant from the deferred library, or removing 'deferred' from the import.
+      correctionMessage: """Try moving the constant from the deferred library, or removing 'deferred' from the import.
 """,
       arguments: {'lexeme': token});
 }
@@ -886,7 +909,7 @@
 const MessageCode messageCantUsePrefixAsExpression = const MessageCode(
     "CantUsePrefixAsExpression",
     analyzerCodes: <String>["PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT"],
-    message: r"""A prefix can't be used as an expression.""");
+    problemMessage: r"""A prefix can't be used as an expression.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeCantUsePrefixWithNullAware =
@@ -896,8 +919,8 @@
 const MessageCode messageCantUsePrefixWithNullAware = const MessageCode(
     "CantUsePrefixWithNullAware",
     analyzerCodes: <String>["PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT"],
-    message: r"""A prefix can't be used with null-aware operators.""",
-    tip: r"""Try replacing '?.' with '.'""");
+    problemMessage: r"""A prefix can't be used with null-aware operators.""",
+    correctionMessage: r"""Try replacing '?.' with '.'""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeCatchSyntax = messageCatchSyntax;
@@ -905,9 +928,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCatchSyntax = const MessageCode("CatchSyntax",
     index: 84,
-    message:
+    problemMessage:
         r"""'catch' must be followed by '(identifier)' or '(identifier, identifier)'.""",
-    tip:
+    correctionMessage:
         r"""No types are needed, the first is given by 'on', the second is always 'StackTrace'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -918,9 +941,9 @@
 const MessageCode messageCatchSyntaxExtraParameters = const MessageCode(
     "CatchSyntaxExtraParameters",
     index: 83,
-    message:
+    problemMessage:
         r"""'catch' must be followed by '(identifier)' or '(identifier, identifier)'.""",
-    tip:
+    correctionMessage:
         r"""No types are needed, the first is given by 'on', the second is always 'StackTrace'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -929,14 +952,14 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageClassInClass = const MessageCode("ClassInClass",
     index: 53,
-    message: r"""Classes can't be declared inside other classes.""",
-    tip: r"""Try moving the class to the top-level.""");
+    problemMessage: r"""Classes can't be declared inside other classes.""",
+    correctionMessage: r"""Try moving the class to the top-level.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateClassInNullAwareReceiver =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""The class '#name' cannot be null.""",
-        tipTemplate: r"""Try replacing '?.' with '.'""",
+        problemMessageTemplate: r"""The class '#name' cannot be null.""",
+        correctionMessageTemplate: r"""Try replacing '?.' with '.'""",
         withArguments: _withArgumentsClassInNullAwareReceiver);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -949,8 +972,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeClassInNullAwareReceiver,
-      message: """The class '${name}' cannot be null.""",
-      tip: """Try replacing '?.' with '.'""",
+      problemMessage: """The class '${name}' cannot be null.""",
+      correctionMessage: """Try replacing '?.' with '.'""",
       arguments: {'name': name});
 }
 
@@ -961,8 +984,8 @@
 const MessageCode messageColonInPlaceOfIn = const MessageCode(
     "ColonInPlaceOfIn",
     index: 54,
-    message: r"""For-in loops use 'in' rather than a colon.""",
-    tip: r"""Try replacing the colon with the keyword 'in'.""");
+    problemMessage: r"""For-in loops use 'in' rather than a colon.""",
+    correctionMessage: r"""Try replacing the colon with the keyword 'in'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -971,9 +994,10 @@
         String
             name2)> templateCombinedMemberSignatureFailed = const Template<
         Message Function(String name, String name2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Class '#name' inherits multiple members named '#name2' with incompatible signatures.""",
-    tipTemplate: r"""Try adding a declaration of '#name2' to '#name'.""",
+    correctionMessageTemplate:
+        r"""Try adding a declaration of '#name2' to '#name'.""",
     withArguments: _withArgumentsCombinedMemberSignatureFailed);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -990,9 +1014,9 @@
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   return new Message(codeCombinedMemberSignatureFailed,
-      message:
+      problemMessage:
           """Class '${name}' inherits multiple members named '${name2}' with incompatible signatures.""",
-      tip: """Try adding a declaration of '${name2}' to '${name}'.""",
+      correctionMessage: """Try adding a declaration of '${name2}' to '${name}'.""",
       arguments: {'name': name, 'name2': name2});
 }
 
@@ -1004,7 +1028,7 @@
 const MessageCode messageCompilingWithSoundNullSafety = const MessageCode(
     "CompilingWithSoundNullSafety",
     severity: Severity.info,
-    message: r"""Compiling with sound null safety""");
+    problemMessage: r"""Compiling with sound null safety""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeCompilingWithoutSoundNullSafety =
@@ -1014,7 +1038,7 @@
 const MessageCode messageCompilingWithoutSoundNullSafety = const MessageCode(
     "CompilingWithoutSoundNullSafety",
     severity: Severity.info,
-    message: r"""Compiling without sound null safety""");
+    problemMessage: r"""Compiling without sound null safety""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -1023,9 +1047,9 @@
         String
             string2)> templateConflictingModifiers = const Template<
         Message Function(String string, String string2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Members can't be declared to be both '#string' and '#string2'.""",
-    tipTemplate: r"""Try removing one of the keywords.""",
+    correctionMessageTemplate: r"""Try removing one of the keywords.""",
     withArguments: _withArgumentsConflictingModifiers);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1040,16 +1064,16 @@
   if (string.isEmpty) throw 'No string provided';
   if (string2.isEmpty) throw 'No string provided';
   return new Message(codeConflictingModifiers,
-      message:
+      problemMessage:
           """Members can't be declared to be both '${string}' and '${string2}'.""",
-      tip: """Try removing one of the keywords.""",
+      correctionMessage: """Try removing one of the keywords.""",
       arguments: {'string': string, 'string2': string2});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateConflictsWithConstructor =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Conflicts with constructor '#name'.""",
+        problemMessageTemplate: r"""Conflicts with constructor '#name'.""",
         withArguments: _withArgumentsConflictsWithConstructor);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1062,14 +1086,14 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeConflictsWithConstructor,
-      message: """Conflicts with constructor '${name}'.""",
+      problemMessage: """Conflicts with constructor '${name}'.""",
       arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateConflictsWithFactory =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Conflicts with factory '#name'.""",
+        problemMessageTemplate: r"""Conflicts with factory '#name'.""",
         withArguments: _withArgumentsConflictsWithFactory);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1083,7 +1107,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeConflictsWithFactory,
-      message: """Conflicts with factory '${name}'.""",
+      problemMessage: """Conflicts with factory '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -1091,7 +1115,7 @@
 const Template<Message Function(String name)>
     templateConflictsWithImplicitSetter =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Conflicts with the implicit setter of the field '#name'.""",
         withArguments: _withArgumentsConflictsWithImplicitSetter);
 
@@ -1105,14 +1129,15 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeConflictsWithImplicitSetter,
-      message: """Conflicts with the implicit setter of the field '${name}'.""",
+      problemMessage:
+          """Conflicts with the implicit setter of the field '${name}'.""",
       arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateConflictsWithMember =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Conflicts with member '#name'.""",
+        problemMessageTemplate: r"""Conflicts with member '#name'.""",
         withArguments: _withArgumentsConflictsWithMember);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1125,14 +1150,14 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeConflictsWithMember,
-      message: """Conflicts with member '${name}'.""",
+      problemMessage: """Conflicts with member '${name}'.""",
       arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateConflictsWithSetter =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Conflicts with setter '#name'.""",
+        problemMessageTemplate: r"""Conflicts with setter '#name'.""",
         withArguments: _withArgumentsConflictsWithSetter);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1145,7 +1170,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeConflictsWithSetter,
-      message: """Conflicts with setter '${name}'.""",
+      problemMessage: """Conflicts with setter '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -1153,7 +1178,7 @@
 const Template<Message Function(String name)>
     templateConflictsWithTypeVariable =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Conflicts with type variable '#name'.""",
+        problemMessageTemplate: r"""Conflicts with type variable '#name'.""",
         withArguments: _withArgumentsConflictsWithTypeVariable);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1166,7 +1191,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeConflictsWithTypeVariable,
-      message: """Conflicts with type variable '${name}'.""",
+      problemMessage: """Conflicts with type variable '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -1178,7 +1203,7 @@
 const MessageCode messageConflictsWithTypeVariableCause = const MessageCode(
     "ConflictsWithTypeVariableCause",
     severity: Severity.context,
-    message: r"""This is the type variable.""");
+    problemMessage: r"""This is the type variable.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstAndFinal = messageConstAndFinal;
@@ -1186,8 +1211,10 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstAndFinal = const MessageCode("ConstAndFinal",
     index: 58,
-    message: r"""Members can't be declared to be both 'const' and 'final'.""",
-    tip: r"""Try removing either the 'const' or 'final' keyword.""");
+    problemMessage:
+        r"""Members can't be declared to be both 'const' and 'final'.""",
+    correctionMessage:
+        r"""Try removing either the 'const' or 'final' keyword.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstClass = messageConstClass;
@@ -1195,8 +1222,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstClass = const MessageCode("ConstClass",
     index: 60,
-    message: r"""Classes can't be declared to be 'const'.""",
-    tip:
+    problemMessage: r"""Classes can't be declared to be 'const'.""",
+    correctionMessage:
         r"""Try removing the 'const' keyword. If you're trying to indicate that instances of the class can be constants, place the 'const' keyword on  the class' constructor(s).""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1206,7 +1233,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstConstructorLateFinalFieldCause =
     const MessageCode("ConstConstructorLateFinalFieldCause",
-        severity: Severity.context, message: r"""This constructor is const.""");
+        severity: Severity.context,
+        problemMessage: r"""This constructor is const.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstConstructorLateFinalFieldError =
@@ -1215,7 +1243,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstConstructorLateFinalFieldError = const MessageCode(
     "ConstConstructorLateFinalFieldError",
-    message:
+    problemMessage:
         r"""Can't have a late final field in a class with a const constructor.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1226,7 +1254,8 @@
 const MessageCode messageConstConstructorNonFinalField = const MessageCode(
     "ConstConstructorNonFinalField",
     analyzerCodes: <String>["CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD"],
-    message: r"""Constructor is marked 'const' so all fields must be final.""");
+    problemMessage:
+        r"""Constructor is marked 'const' so all fields must be final.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstConstructorNonFinalFieldCause =
@@ -1236,7 +1265,7 @@
 const MessageCode messageConstConstructorNonFinalFieldCause = const MessageCode(
     "ConstConstructorNonFinalFieldCause",
     severity: Severity.context,
-    message: r"""Field isn't final, but constructor is 'const'.""");
+    problemMessage: r"""Field isn't final, but constructor is 'const'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstConstructorRedirectionToNonConst =
@@ -1245,7 +1274,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstConstructorRedirectionToNonConst =
     const MessageCode("ConstConstructorRedirectionToNonConst",
-        message:
+        problemMessage:
             r"""A constant constructor can't call a non-constant constructor.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1255,8 +1284,9 @@
 const MessageCode messageConstConstructorWithBody = const MessageCode(
     "ConstConstructorWithBody",
     analyzerCodes: <String>["CONST_CONSTRUCTOR_WITH_BODY"],
-    message: r"""A const constructor can't have a body.""",
-    tip: r"""Try removing either the 'const' keyword or the body.""");
+    problemMessage: r"""A const constructor can't have a body.""",
+    correctionMessage:
+        r"""Try removing either the 'const' keyword or the body.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstConstructorWithNonConstSuper =
@@ -1266,7 +1296,7 @@
 const MessageCode messageConstConstructorWithNonConstSuper = const MessageCode(
     "ConstConstructorWithNonConstSuper",
     analyzerCodes: <String>["CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER"],
-    message:
+    problemMessage:
         r"""A constant constructor can't call a non-constant super constructor.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1276,14 +1306,15 @@
 const MessageCode messageConstEvalCircularity = const MessageCode(
     "ConstEvalCircularity",
     analyzerCodes: <String>["RECURSIVE_COMPILE_TIME_CONSTANT"],
-    message: r"""Constant expression depends on itself.""");
+    problemMessage: r"""Constant expression depends on itself.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstEvalContext = messageConstEvalContext;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageConstEvalContext =
-    const MessageCode("ConstEvalContext", message: r"""While analyzing:""");
+const MessageCode messageConstEvalContext = const MessageCode(
+    "ConstEvalContext",
+    problemMessage: r"""While analyzing:""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -1291,9 +1322,9 @@
         String
             nameOKEmpty)> templateConstEvalDeferredLibrary = const Template<
         Message Function(String nameOKEmpty)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""'#nameOKEmpty' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try moving the constant from the deferred library, or removing 'deferred' from the import.
 """,
     withArguments: _withArgumentsConstEvalDeferredLibrary);
@@ -1310,9 +1341,9 @@
   // ignore: unnecessary_null_comparison
   if (nameOKEmpty == null || nameOKEmpty.isEmpty) nameOKEmpty = '(unnamed)';
   return new Message(codeConstEvalDeferredLibrary,
-      message:
+      problemMessage:
           """'${nameOKEmpty}' can't be used in a constant expression because it's marked as 'deferred' which means it isn't available until loaded.""",
-      tip: """Try moving the constant from the deferred library, or removing 'deferred' from the import.
+      correctionMessage: """Try moving the constant from the deferred library, or removing 'deferred' from the import.
 """,
       arguments: {'nameOKEmpty': nameOKEmpty});
 }
@@ -1320,7 +1351,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string)> templateConstEvalError =
     const Template<Message Function(String string)>(
-        messageTemplate: r"""Error evaluating constant expression: #string""",
+        problemMessageTemplate:
+            r"""Error evaluating constant expression: #string""",
         withArguments: _withArgumentsConstEvalError);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1333,7 +1365,7 @@
 Message _withArgumentsConstEvalError(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeConstEvalError,
-      message: """Error evaluating constant expression: ${string}""",
+      problemMessage: """Error evaluating constant expression: ${string}""",
       arguments: {'string': string});
 }
 
@@ -1344,7 +1376,7 @@
 const MessageCode messageConstEvalExtension = const MessageCode(
     "ConstEvalExtension",
     analyzerCodes: <String>["NOT_CONSTANT_EXPRESSION"],
-    message:
+    problemMessage:
         r"""Extension operations can't be used in constant expressions.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1354,7 +1386,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstEvalExternalConstructor = const MessageCode(
     "ConstEvalExternalConstructor",
-    message:
+    problemMessage:
         r"""External constructors can't be evaluated in constant expressions.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1363,7 +1395,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstEvalExternalFactory = const MessageCode(
     "ConstEvalExternalFactory",
-    message:
+    problemMessage:
         r"""External factory constructors can't be evaluated in constant expressions.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1373,13 +1405,13 @@
 const MessageCode messageConstEvalFailedAssertion = const MessageCode(
     "ConstEvalFailedAssertion",
     analyzerCodes: <String>["CONST_EVAL_THROWS_EXCEPTION"],
-    message: r"""This assertion failed.""");
+    problemMessage: r"""This assertion failed.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String stringOKEmpty)>
     templateConstEvalFailedAssertionWithMessage =
     const Template<Message Function(String stringOKEmpty)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""This assertion failed with message: #stringOKEmpty""",
         withArguments: _withArgumentsConstEvalFailedAssertionWithMessage);
 
@@ -1396,7 +1428,8 @@
   // ignore: unnecessary_null_comparison
   if (stringOKEmpty == null || stringOKEmpty.isEmpty) stringOKEmpty = '(empty)';
   return new Message(codeConstEvalFailedAssertionWithMessage,
-      message: """This assertion failed with message: ${stringOKEmpty}""",
+      problemMessage:
+          """This assertion failed with message: ${stringOKEmpty}""",
       arguments: {'stringOKEmpty': stringOKEmpty});
 }
 
@@ -1404,7 +1437,7 @@
 const Template<Message Function(String nameOKEmpty)>
     templateConstEvalGetterNotFound =
     const Template<Message Function(String nameOKEmpty)>(
-        messageTemplate: r"""Variable get not found: '#nameOKEmpty'""",
+        problemMessageTemplate: r"""Variable get not found: '#nameOKEmpty'""",
         withArguments: _withArgumentsConstEvalGetterNotFound);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1418,7 +1451,7 @@
   // ignore: unnecessary_null_comparison
   if (nameOKEmpty == null || nameOKEmpty.isEmpty) nameOKEmpty = '(unnamed)';
   return new Message(codeConstEvalGetterNotFound,
-      message: """Variable get not found: '${nameOKEmpty}'""",
+      problemMessage: """Variable get not found: '${nameOKEmpty}'""",
       arguments: {'nameOKEmpty': nameOKEmpty});
 }
 
@@ -1426,7 +1459,7 @@
 const Template<Message Function(String nameOKEmpty)>
     templateConstEvalInvalidStaticInvocation =
     const Template<Message Function(String nameOKEmpty)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The invocation of '#nameOKEmpty' is not allowed in a constant expression.""",
         withArguments: _withArgumentsConstEvalInvalidStaticInvocation);
 
@@ -1442,7 +1475,7 @@
   // ignore: unnecessary_null_comparison
   if (nameOKEmpty == null || nameOKEmpty.isEmpty) nameOKEmpty = '(unnamed)';
   return new Message(codeConstEvalInvalidStaticInvocation,
-      message:
+      problemMessage:
           """The invocation of '${nameOKEmpty}' is not allowed in a constant expression.""",
       arguments: {'nameOKEmpty': nameOKEmpty});
 }
@@ -1455,7 +1488,7 @@
         String
             string3)> templateConstEvalNegativeShift = const Template<
         Message Function(String string, String string2, String string3)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Binary operator '#string' on '#string2' requires non-negative operand, but was '#string3'.""",
     withArguments: _withArgumentsConstEvalNegativeShift);
 
@@ -1473,7 +1506,7 @@
   if (string2.isEmpty) throw 'No string provided';
   if (string3.isEmpty) throw 'No string provided';
   return new Message(codeConstEvalNegativeShift,
-      message:
+      problemMessage:
           """Binary operator '${string}' on '${string2}' requires non-negative operand, but was '${string3}'.""",
       arguments: {'string': string, 'string2': string2, 'string3': string3});
 }
@@ -1484,7 +1517,7 @@
         String
             nameOKEmpty)> templateConstEvalNonConstantVariableGet = const Template<
         Message Function(String nameOKEmpty)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The variable '#nameOKEmpty' is not a constant, only constant expressions are allowed.""",
     withArguments: _withArgumentsConstEvalNonConstantVariableGet);
 
@@ -1500,7 +1533,7 @@
   // ignore: unnecessary_null_comparison
   if (nameOKEmpty == null || nameOKEmpty.isEmpty) nameOKEmpty = '(unnamed)';
   return new Message(codeConstEvalNonConstantVariableGet,
-      message:
+      problemMessage:
           """The variable '${nameOKEmpty}' is not a constant, only constant expressions are allowed.""",
       arguments: {'nameOKEmpty': nameOKEmpty});
 }
@@ -1511,7 +1544,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstEvalNonNull = const MessageCode(
     "ConstEvalNonNull",
-    message: r"""Constant expression must be non-null.""");
+    problemMessage: r"""Constant expression must be non-null.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstEvalNotListOrSetInSpread =
@@ -1521,7 +1554,7 @@
 const MessageCode messageConstEvalNotListOrSetInSpread = const MessageCode(
     "ConstEvalNotListOrSetInSpread",
     analyzerCodes: <String>["CONST_SPREAD_EXPECTED_LIST_OR_SET"],
-    message:
+    problemMessage:
         r"""Only lists and sets can be used in spreads in constant lists and sets.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1531,7 +1564,7 @@
 const MessageCode messageConstEvalNotMapInSpread = const MessageCode(
     "ConstEvalNotMapInSpread",
     analyzerCodes: <String>["CONST_SPREAD_EXPECTED_MAP"],
-    message: r"""Only maps can be used in spreads in constant maps.""");
+    problemMessage: r"""Only maps can be used in spreads in constant maps.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstEvalNullValue = messageConstEvalNullValue;
@@ -1540,7 +1573,7 @@
 const MessageCode messageConstEvalNullValue = const MessageCode(
     "ConstEvalNullValue",
     analyzerCodes: <String>["CONST_EVAL_THROWS_EXCEPTION"],
-    message: r"""Null value during constant evaluation.""");
+    problemMessage: r"""Null value during constant evaluation.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstEvalStartingPoint = messageConstEvalStartingPoint;
@@ -1548,7 +1581,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstEvalStartingPoint = const MessageCode(
     "ConstEvalStartingPoint",
-    message: r"""Constant evaluation error:""");
+    problemMessage: r"""Constant evaluation error:""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -1557,7 +1590,7 @@
         String
             string2)> templateConstEvalTruncateError = const Template<
         Message Function(String string, String string2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Binary operator '#string ~/ #string2' results is Infinity or NaN.""",
     withArguments: _withArgumentsConstEvalTruncateError);
 
@@ -1573,7 +1606,7 @@
   if (string.isEmpty) throw 'No string provided';
   if (string2.isEmpty) throw 'No string provided';
   return new Message(codeConstEvalTruncateError,
-      message:
+      problemMessage:
           """Binary operator '${string} ~/ ${string2}' results is Infinity or NaN.""",
       arguments: {'string': string, 'string2': string2});
 }
@@ -1584,13 +1617,13 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstEvalUnevaluated = const MessageCode(
     "ConstEvalUnevaluated",
-    message: r"""Couldn't evaluate constant expression.""");
+    problemMessage: r"""Couldn't evaluate constant expression.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String stringOKEmpty)>
     templateConstEvalUnhandledCoreException =
     const Template<Message Function(String stringOKEmpty)>(
-        messageTemplate: r"""Unhandled core exception: #stringOKEmpty""",
+        problemMessageTemplate: r"""Unhandled core exception: #stringOKEmpty""",
         withArguments: _withArgumentsConstEvalUnhandledCoreException);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1605,7 +1638,7 @@
   // ignore: unnecessary_null_comparison
   if (stringOKEmpty == null || stringOKEmpty.isEmpty) stringOKEmpty = '(empty)';
   return new Message(codeConstEvalUnhandledCoreException,
-      message: """Unhandled core exception: ${stringOKEmpty}""",
+      problemMessage: """Unhandled core exception: ${stringOKEmpty}""",
       arguments: {'stringOKEmpty': stringOKEmpty});
 }
 
@@ -1616,7 +1649,7 @@
         String
             string2)> templateConstEvalZeroDivisor = const Template<
         Message Function(String string, String string2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Binary operator '#string' on '#string2' requires non-zero divisor, but divisor was '0'.""",
     withArguments: _withArgumentsConstEvalZeroDivisor);
 
@@ -1632,7 +1665,7 @@
   if (string.isEmpty) throw 'No string provided';
   if (string2.isEmpty) throw 'No string provided';
   return new Message(codeConstEvalZeroDivisor,
-      message:
+      problemMessage:
           """Binary operator '${string}' on '${string2}' requires non-zero divisor, but divisor was '0'.""",
       arguments: {'string': string, 'string2': string2});
 }
@@ -1643,9 +1676,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstFactory = const MessageCode("ConstFactory",
     index: 62,
-    message:
+    problemMessage:
         r"""Only redirecting factory constructors can be declared to be 'const'.""",
-    tip:
+    correctionMessage:
         r"""Try removing the 'const' keyword, or replacing the body with '=' followed by a valid target.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1656,9 +1689,9 @@
 const MessageCode messageConstFactoryRedirectionToNonConst = const MessageCode(
     "ConstFactoryRedirectionToNonConst",
     analyzerCodes: <String>["REDIRECT_TO_NON_CONST_CONSTRUCTOR"],
-    message:
+    problemMessage:
         r"""Constant factory constructor can't delegate to a non-constant constructor.""",
-    tip:
+    correctionMessage:
         r"""Try redirecting to a different constructor or marking the target constructor 'const'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1667,8 +1700,9 @@
         String
             name)> templateConstFieldWithoutInitializer = const Template<
         Message Function(String name)>(
-    messageTemplate: r"""The const variable '#name' must be initialized.""",
-    tipTemplate:
+    problemMessageTemplate:
+        r"""The const variable '#name' must be initialized.""",
+    correctionMessageTemplate:
         r"""Try adding an initializer ('= expression') to the declaration.""",
     withArguments: _withArgumentsConstFieldWithoutInitializer);
 
@@ -1682,8 +1716,9 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeConstFieldWithoutInitializer,
-      message: """The const variable '${name}' must be initialized.""",
-      tip: """Try adding an initializer ('= expression') to the declaration.""",
+      problemMessage: """The const variable '${name}' must be initialized.""",
+      correctionMessage:
+          """Try adding an initializer ('= expression') to the declaration.""",
       arguments: {'name': name});
 }
 
@@ -1694,8 +1729,8 @@
 const MessageCode messageConstInstanceField = const MessageCode(
     "ConstInstanceField",
     analyzerCodes: <String>["CONST_INSTANCE_FIELD"],
-    message: r"""Only static fields can be declared as const.""",
-    tip:
+    problemMessage: r"""Only static fields can be declared as const.""",
+    correctionMessage:
         r"""Try using 'final' instead of 'const', or adding the keyword 'static'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1704,9 +1739,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstMethod = const MessageCode("ConstMethod",
     index: 63,
-    message:
+    problemMessage:
         r"""Getters, setters and methods can't be declared to be 'const'.""",
-    tip: r"""Try removing the 'const' keyword.""");
+    correctionMessage: r"""Try removing the 'const' keyword.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstructorCyclic = messageConstructorCyclic;
@@ -1715,15 +1750,15 @@
 const MessageCode messageConstructorCyclic = const MessageCode(
     "ConstructorCyclic",
     analyzerCodes: <String>["RECURSIVE_CONSTRUCTOR_REDIRECT"],
-    message: r"""Redirecting constructors can't be cyclic.""",
-    tip:
+    problemMessage: r"""Redirecting constructors can't be cyclic.""",
+    correctionMessage:
         r"""Try to have all constructors eventually redirect to a non-redirecting constructor.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateConstructorInitializeSameInstanceVariableSeveralTimes =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""'#name' was already initialized by this constructor.""",
         withArguments:
             _withArgumentsConstructorInitializeSameInstanceVariableSeveralTimes);
@@ -1741,14 +1776,15 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeConstructorInitializeSameInstanceVariableSeveralTimes,
-      message: """'${name}' was already initialized by this constructor.""",
+      problemMessage:
+          """'${name}' was already initialized by this constructor.""",
       arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateConstructorNotFound =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Couldn't find constructor '#name'.""",
+        problemMessageTemplate: r"""Couldn't find constructor '#name'.""",
         withArguments: _withArgumentsConstructorNotFound);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1761,7 +1797,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeConstructorNotFound,
-      message: """Couldn't find constructor '${name}'.""",
+      problemMessage: """Couldn't find constructor '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -1772,7 +1808,7 @@
 const MessageCode messageConstructorNotSync = const MessageCode(
     "ConstructorNotSync",
     analyzerCodes: <String>["NON_SYNC_CONSTRUCTOR"],
-    message:
+    problemMessage:
         r"""Constructor bodies can't use 'async', 'async*', or 'sync*'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1782,9 +1818,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageConstructorTearOffWithTypeArguments = const MessageCode(
     "ConstructorTearOffWithTypeArguments",
-    message:
+    problemMessage:
         r"""A constructor tear-off can't have type arguments after the constructor name.""",
-    tip:
+    correctionMessage:
         r"""Try removing the type arguments or placing them after the class name.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1795,8 +1831,8 @@
 const MessageCode messageConstructorWithReturnType = const MessageCode(
     "ConstructorWithReturnType",
     index: 55,
-    message: r"""Constructors can't have a return type.""",
-    tip: r"""Try removing the return type.""");
+    problemMessage: r"""Constructors can't have a return type.""",
+    correctionMessage: r"""Try removing the return type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstructorWithTypeArguments =
@@ -1806,9 +1842,9 @@
 const MessageCode messageConstructorWithTypeArguments = const MessageCode(
     "ConstructorWithTypeArguments",
     index: 118,
-    message:
+    problemMessage:
         r"""A constructor invocation can't have type arguments after the constructor name.""",
-    tip:
+    correctionMessage:
         r"""Try removing the type arguments or placing them after the class name.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1819,8 +1855,8 @@
 const MessageCode messageConstructorWithTypeParameters = const MessageCode(
     "ConstructorWithTypeParameters",
     index: 99,
-    message: r"""Constructors can't have type parameters.""",
-    tip: r"""Try removing the type parameters.""");
+    problemMessage: r"""Constructors can't have type parameters.""",
+    correctionMessage: r"""Try removing the type parameters.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstructorWithWrongName = messageConstructorWithWrongName;
@@ -1829,14 +1865,15 @@
 const MessageCode messageConstructorWithWrongName = const MessageCode(
     "ConstructorWithWrongName",
     index: 102,
-    message:
+    problemMessage:
         r"""The name of a constructor must match the name of the enclosing class.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateConstructorWithWrongNameContext =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""The name of the enclosing class is '#name'.""",
+        problemMessageTemplate:
+            r"""The name of the enclosing class is '#name'.""",
         withArguments: _withArgumentsConstructorWithWrongNameContext);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1849,7 +1886,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeConstructorWithWrongNameContext,
-      message: """The name of the enclosing class is '${name}'.""",
+      problemMessage: """The name of the enclosing class is '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -1860,7 +1897,7 @@
 const MessageCode messageContinueLabelNotTarget = const MessageCode(
     "ContinueLabelNotTarget",
     analyzerCodes: <String>["LABEL_UNDEFINED"],
-    message: r"""Target of continue must be a label.""");
+    problemMessage: r"""Target of continue must be a label.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeContinueOutsideOfLoop = messageContinueOutsideOfLoop;
@@ -1869,15 +1906,15 @@
 const MessageCode messageContinueOutsideOfLoop = const MessageCode(
     "ContinueOutsideOfLoop",
     index: 2,
-    message:
+    problemMessage:
         r"""A continue statement can't be used outside of a loop or switch statement.""",
-    tip: r"""Try removing the continue statement.""");
+    correctionMessage: r"""Try removing the continue statement.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateContinueTargetOutsideFunction =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't continue at '#name' in a different function.""",
         withArguments: _withArgumentsContinueTargetOutsideFunction);
 
@@ -1891,7 +1928,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeContinueTargetOutsideFunction,
-      message: """Can't continue at '${name}' in a different function.""",
+      problemMessage:
+          """Can't continue at '${name}' in a different function.""",
       arguments: {'name': name});
 }
 
@@ -1903,16 +1941,16 @@
 const MessageCode messageContinueWithoutLabelInCase = const MessageCode(
     "ContinueWithoutLabelInCase",
     index: 64,
-    message:
+    problemMessage:
         r"""A continue statement in a switch statement must have a label as a target.""",
-    tip:
+    correctionMessage:
         r"""Try adding a label associated with one of the case clauses to the continue statement.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string, String string2)>
     templateCouldNotParseUri =
     const Template<Message Function(String string, String string2)>(
-        messageTemplate: r"""Couldn't parse URI '#string':
+        problemMessageTemplate: r"""Couldn't parse URI '#string':
   #string2.""", withArguments: _withArgumentsCouldNotParseUri);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1927,7 +1965,7 @@
   if (string.isEmpty) throw 'No string provided';
   if (string2.isEmpty) throw 'No string provided';
   return new Message(codeCouldNotParseUri,
-      message: """Couldn't parse URI '${string}':
+      problemMessage: """Couldn't parse URI '${string}':
   ${string2}.""", arguments: {'string': string, 'string2': string2});
 }
 
@@ -1938,9 +1976,10 @@
 const MessageCode messageCovariantAndStatic = const MessageCode(
     "CovariantAndStatic",
     index: 66,
-    message:
+    problemMessage:
         r"""Members can't be declared to be both 'covariant' and 'static'.""",
-    tip: r"""Try removing either the 'covariant' or 'static' keyword.""");
+    correctionMessage:
+        r"""Try removing either the 'covariant' or 'static' keyword.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeCovariantMember = messageCovariantMember;
@@ -1948,21 +1987,19 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCovariantMember = const MessageCode("CovariantMember",
     index: 67,
-    message:
+    problemMessage:
         r"""Getters, setters and methods can't be declared to be 'covariant'.""",
-    tip: r"""Try removing the 'covariant' keyword.""");
+    correctionMessage: r"""Try removing the 'covariant' keyword.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-    Message Function(
-        String name,
-        String
-            string)> templateCycleInTypeVariables = const Template<
-        Message Function(String name, String string)>(
-    messageTemplate: r"""Type '#name' is a bound of itself via '#string'.""",
-    tipTemplate:
-        r"""Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.""",
-    withArguments: _withArgumentsCycleInTypeVariables);
+const Template<Message Function(String name, String string)>
+    templateCycleInTypeVariables =
+    const Template<Message Function(String name, String string)>(
+        problemMessageTemplate:
+            r"""Type '#name' is a bound of itself via '#string'.""",
+        correctionMessageTemplate:
+            r"""Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.""",
+        withArguments: _withArgumentsCycleInTypeVariables);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String name, String string)>
@@ -1977,8 +2014,9 @@
   name = demangleMixinApplicationName(name);
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeCycleInTypeVariables,
-      message: """Type '${name}' is a bound of itself via '${string}'.""",
-      tip:
+      problemMessage:
+          """Type '${name}' is a bound of itself via '${string}'.""",
+      correctionMessage:
           """Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.""",
       arguments: {'name': name, 'string': string});
 }
@@ -1986,7 +2024,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateCyclicClassHierarchy =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""'#name' is a supertype of itself.""",
+        problemMessageTemplate: r"""'#name' is a supertype of itself.""",
         withArguments: _withArgumentsCyclicClassHierarchy);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1999,7 +2037,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeCyclicClassHierarchy,
-      message: """'${name}' is a supertype of itself.""",
+      problemMessage: """'${name}' is a supertype of itself.""",
       arguments: {'name': name});
 }
 
@@ -2007,7 +2045,7 @@
 const Template<Message Function(String name)>
     templateCyclicRedirectingFactoryConstructors =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Cyclic definition of factory '#name'.""",
+        problemMessageTemplate: r"""Cyclic definition of factory '#name'.""",
         withArguments: _withArgumentsCyclicRedirectingFactoryConstructors);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2022,14 +2060,15 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeCyclicRedirectingFactoryConstructors,
-      message: """Cyclic definition of factory '${name}'.""",
+      problemMessage: """Cyclic definition of factory '${name}'.""",
       arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateCyclicTypedef =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""The typedef '#name' has a reference to itself.""",
+        problemMessageTemplate:
+            r"""The typedef '#name' has a reference to itself.""",
         withArguments: _withArgumentsCyclicTypedef);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2042,7 +2081,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeCyclicTypedef,
-      message: """The typedef '${name}' has a reference to itself.""",
+      problemMessage: """The typedef '${name}' has a reference to itself.""",
       arguments: {'name': name});
 }
 
@@ -2050,7 +2089,7 @@
 const Template<Message Function(String name, String string)>
     templateDebugTrace =
     const Template<Message Function(String name, String string)>(
-        messageTemplate: r"""Fatal '#name' at:
+        problemMessageTemplate: r"""Fatal '#name' at:
 #string""", withArguments: _withArgumentsDebugTrace);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2063,7 +2102,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   if (string.isEmpty) throw 'No string provided';
-  return new Message(codeDebugTrace, message: """Fatal '${name}' at:
+  return new Message(codeDebugTrace, problemMessage: """Fatal '${name}' at:
 ${string}""", arguments: {'name': name, 'string': string});
 }
 
@@ -2075,7 +2114,7 @@
 const MessageCode messageDeclaredMemberConflictsWithInheritedMember =
     const MessageCode("DeclaredMemberConflictsWithInheritedMember",
         analyzerCodes: <String>["DECLARED_MEMBER_CONFLICTS_WITH_INHERITED"],
-        message:
+        problemMessage:
             r"""Can't declare a member that conflicts with an inherited one.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2086,7 +2125,7 @@
 const MessageCode messageDeclaredMemberConflictsWithInheritedMemberCause =
     const MessageCode("DeclaredMemberConflictsWithInheritedMemberCause",
         severity: Severity.context,
-        message: r"""This is the inherited member.""");
+        problemMessage: r"""This is the inherited member.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeDeclaredMemberConflictsWithOverriddenMembersCause =
@@ -2096,7 +2135,7 @@
 const MessageCode messageDeclaredMemberConflictsWithOverriddenMembersCause =
     const MessageCode("DeclaredMemberConflictsWithOverriddenMembersCause",
         severity: Severity.context,
-        message: r"""This is one of the overridden members.""");
+        problemMessage: r"""This is one of the overridden members.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeDefaultListConstructorError =
@@ -2105,16 +2144,16 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageDefaultListConstructorError = const MessageCode(
     "DefaultListConstructorError",
-    message: r"""Can't use the default List constructor.""",
-    tip: r"""Try using List.filled instead.""");
+    problemMessage: r"""Can't use the default List constructor.""",
+    correctionMessage: r"""Try using List.filled instead.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateDefaultValueInRedirectingFactoryConstructor =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't have a default value here because any default values of '#name' would be used instead.""",
-        tipTemplate: r"""Try removing the default value.""",
+        correctionMessageTemplate: r"""Try removing the default value.""",
         withArguments:
             _withArgumentsDefaultValueInRedirectingFactoryConstructor);
 
@@ -2132,9 +2171,9 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeDefaultValueInRedirectingFactoryConstructor,
-      message:
+      problemMessage:
           """Can't have a default value here because any default values of '${name}' would be used instead.""",
-      tip: """Try removing the default value.""",
+      correctionMessage: """Try removing the default value.""",
       arguments: {'name': name});
 }
 
@@ -2145,9 +2184,10 @@
 const MessageCode messageDeferredAfterPrefix = const MessageCode(
     "DeferredAfterPrefix",
     index: 68,
-    message:
+    problemMessage:
         r"""The deferred keyword should come immediately before the prefix ('as' clause).""",
-    tip: r"""Try moving the deferred keyword before the prefix.""");
+    correctionMessage:
+        r"""Try moving the deferred keyword before the prefix.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -2155,9 +2195,10 @@
         String
             name)> templateDeferredExtensionImport = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Extension '#name' cannot be imported through a deferred import.""",
-    tipTemplate: r"""Try adding the `hide #name` to the import.""",
+    correctionMessageTemplate:
+        r"""Try adding the `hide #name` to the import.""",
     withArguments: _withArgumentsDeferredExtensionImport);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2171,9 +2212,9 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeDeferredExtensionImport,
-      message:
+      problemMessage:
           """Extension '${name}' cannot be imported through a deferred import.""",
-      tip: """Try adding the `hide ${name}` to the import.""",
+      correctionMessage: """Try adding the `hide ${name}` to the import.""",
       arguments: {'name': name});
 }
 
@@ -2183,7 +2224,7 @@
         String
             name)> templateDeferredPrefixDuplicated = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Can't use the name '#name' for a deferred library, as the name is used elsewhere.""",
     withArguments: _withArgumentsDeferredPrefixDuplicated);
 
@@ -2197,7 +2238,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeDeferredPrefixDuplicated,
-      message:
+      problemMessage:
           """Can't use the name '${name}' for a deferred library, as the name is used elsewhere.""",
       arguments: {'name': name});
 }
@@ -2206,7 +2247,7 @@
 const Template<Message Function(String name)>
     templateDeferredPrefixDuplicatedCause =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""'#name' is used here.""",
+        problemMessageTemplate: r"""'#name' is used here.""",
         withArguments: _withArgumentsDeferredPrefixDuplicatedCause);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2219,7 +2260,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeDeferredPrefixDuplicatedCause,
-      message: """'${name}' is used here.""", arguments: {'name': name});
+      problemMessage: """'${name}' is used here.""", arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2229,7 +2270,7 @@
     templateDillOutlineSummary = const Template<
             Message Function(
                 int count, int count2, num _num1, num _num2, num _num3)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Indexed #count libraries (#count2 bytes) in #num1%.3ms, that is,
 #num2%12.3 bytes/ms, and
 #num3%12.3 ms/libraries.""",
@@ -2260,7 +2301,7 @@
   if (_num3 == null) throw 'No number provided';
   String num3 = _num3.toStringAsFixed(3).padLeft(12);
   return new Message(codeDillOutlineSummary,
-      message:
+      problemMessage:
           """Indexed ${count} libraries (${count2} bytes) in ${num1}ms, that is,
 ${num2} bytes/ms, and
 ${num3} ms/libraries.""",
@@ -2279,8 +2320,8 @@
         String
             name)> templateDirectCycleInTypeVariables = const Template<
         Message Function(String name)>(
-    messageTemplate: r"""Type '#name' can't use itself as a bound.""",
-    tipTemplate:
+    problemMessageTemplate: r"""Type '#name' can't use itself as a bound.""",
+    correctionMessageTemplate:
         r"""Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.""",
     withArguments: _withArgumentsDirectCycleInTypeVariables);
 
@@ -2294,8 +2335,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeDirectCycleInTypeVariables,
-      message: """Type '${name}' can't use itself as a bound.""",
-      tip:
+      problemMessage: """Type '${name}' can't use itself as a bound.""",
+      correctionMessage:
           """Try breaking the cycle by removing at least on of the 'extends' clauses in the cycle.""",
       arguments: {'name': name});
 }
@@ -2308,8 +2349,9 @@
 const MessageCode messageDirectiveAfterDeclaration = const MessageCode(
     "DirectiveAfterDeclaration",
     index: 69,
-    message: r"""Directives must appear before any declarations.""",
-    tip: r"""Try moving the directive before any declarations.""");
+    problemMessage: r"""Directives must appear before any declarations.""",
+    correctionMessage:
+        r"""Try moving the directive before any declarations.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeDuplicateDeferred = messageDuplicateDeferred;
@@ -2318,16 +2360,18 @@
 const MessageCode messageDuplicateDeferred = const MessageCode(
     "DuplicateDeferred",
     index: 71,
-    message: r"""An import directive can only have one 'deferred' keyword.""",
-    tip: r"""Try removing all but one 'deferred' keyword.""");
+    problemMessage:
+        r"""An import directive can only have one 'deferred' keyword.""",
+    correctionMessage: r"""Try removing all but one 'deferred' keyword.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateDuplicateLabelInSwitchStatement =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The label '#name' was already used in this switch statement.""",
-        tipTemplate: r"""Try choosing a different name for this label.""",
+        correctionMessageTemplate:
+            r"""Try choosing a different name for this label.""",
         withArguments: _withArgumentsDuplicateLabelInSwitchStatement);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2340,9 +2384,9 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeDuplicateLabelInSwitchStatement,
-      message:
+      problemMessage:
           """The label '${name}' was already used in this switch statement.""",
-      tip: """Try choosing a different name for this label.""",
+      correctionMessage: """Try choosing a different name for this label.""",
       arguments: {'name': name});
 }
 
@@ -2352,13 +2396,15 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageDuplicatePrefix = const MessageCode("DuplicatePrefix",
     index: 73,
-    message: r"""An import directive can only have one prefix ('as' clause).""",
-    tip: r"""Try removing all but one prefix.""");
+    problemMessage:
+        r"""An import directive can only have one prefix ('as' clause).""",
+    correctionMessage: r"""Try removing all but one prefix.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateDuplicatedDeclaration =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""'#name' is already declared in this scope.""",
+        problemMessageTemplate:
+            r"""'#name' is already declared in this scope.""",
         withArguments: _withArgumentsDuplicatedDeclaration);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2371,7 +2417,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedDeclaration,
-      message: """'${name}' is already declared in this scope.""",
+      problemMessage: """'${name}' is already declared in this scope.""",
       arguments: {'name': name});
 }
 
@@ -2379,7 +2425,7 @@
 const Template<Message Function(String name)>
     templateDuplicatedDeclarationCause =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Previous declaration of '#name'.""",
+        problemMessageTemplate: r"""Previous declaration of '#name'.""",
         withArguments: _withArgumentsDuplicatedDeclarationCause);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2392,7 +2438,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedDeclarationCause,
-      message: """Previous declaration of '${name}'.""",
+      problemMessage: """Previous declaration of '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -2402,7 +2448,7 @@
         String
             name)> templateDuplicatedDeclarationSyntheticCause = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Previous declaration of '#name' is implied by this definition.""",
     withArguments: _withArgumentsDuplicatedDeclarationSyntheticCause);
 
@@ -2418,7 +2464,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedDeclarationSyntheticCause,
-      message:
+      problemMessage:
           """Previous declaration of '${name}' is implied by this definition.""",
       arguments: {'name': name});
 }
@@ -2426,7 +2472,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateDuplicatedDeclarationUse =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't use '#name' because it is declared more than once.""",
         withArguments: _withArgumentsDuplicatedDeclarationUse);
 
@@ -2441,7 +2487,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedDeclarationUse,
-      message: """Can't use '${name}' because it is declared more than once.""",
+      problemMessage:
+          """Can't use '${name}' because it is declared more than once.""",
       arguments: {'name': name});
 }
 
@@ -2449,7 +2496,7 @@
 const Template<Message Function(String name, Uri uri_, Uri uri2_)>
     templateDuplicatedExport =
     const Template<Message Function(String name, Uri uri_, Uri uri2_)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""'#name' is exported from both '#uri' and '#uri2'.""",
         withArguments: _withArgumentsDuplicatedExport);
 
@@ -2467,7 +2514,8 @@
   String? uri = relativizeUri(uri_);
   String? uri2 = relativizeUri(uri2_);
   return new Message(codeDuplicatedExport,
-      message: """'${name}' is exported from both '${uri}' and '${uri2}'.""",
+      problemMessage:
+          """'${name}' is exported from both '${uri}' and '${uri2}'.""",
       arguments: {'name': name, 'uri': uri_, 'uri2': uri2_});
 }
 
@@ -2475,7 +2523,7 @@
 const Template<Message Function(String name, Uri uri_, Uri uri2_)>
     templateDuplicatedExportInType =
     const Template<Message Function(String name, Uri uri_, Uri uri2_)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""'#name' is exported from both '#uri' and '#uri2'.""",
         withArguments: _withArgumentsDuplicatedExportInType);
 
@@ -2493,7 +2541,8 @@
   String? uri = relativizeUri(uri_);
   String? uri2 = relativizeUri(uri2_);
   return new Message(codeDuplicatedExportInType,
-      message: """'${name}' is exported from both '${uri}' and '${uri2}'.""",
+      problemMessage:
+          """'${name}' is exported from both '${uri}' and '${uri2}'.""",
       arguments: {'name': name, 'uri': uri_, 'uri2': uri2_});
 }
 
@@ -2501,7 +2550,7 @@
 const Template<Message Function(String name, Uri uri_, Uri uri2_)>
     templateDuplicatedImportInType =
     const Template<Message Function(String name, Uri uri_, Uri uri2_)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""'#name' is imported from both '#uri' and '#uri2'.""",
         withArguments: _withArgumentsDuplicatedImportInType);
 
@@ -2519,15 +2568,17 @@
   String? uri = relativizeUri(uri_);
   String? uri2 = relativizeUri(uri2_);
   return new Message(codeDuplicatedImportInType,
-      message: """'${name}' is imported from both '${uri}' and '${uri2}'.""",
+      problemMessage:
+          """'${name}' is imported from both '${uri}' and '${uri2}'.""",
       arguments: {'name': name, 'uri': uri_, 'uri2': uri2_});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateDuplicatedModifier =
     const Template<Message Function(Token token)>(
-        messageTemplate: r"""The modifier '#lexeme' was already specified.""",
-        tipTemplate:
+        problemMessageTemplate:
+            r"""The modifier '#lexeme' was already specified.""",
+        correctionMessageTemplate:
             r"""Try removing all but one occurrence of the modifier.""",
         withArguments: _withArgumentsDuplicatedModifier);
 
@@ -2539,8 +2590,9 @@
 Message _withArgumentsDuplicatedModifier(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeDuplicatedModifier,
-      message: """The modifier '${lexeme}' was already specified.""",
-      tip: """Try removing all but one occurrence of the modifier.""",
+      problemMessage: """The modifier '${lexeme}' was already specified.""",
+      correctionMessage:
+          """Try removing all but one occurrence of the modifier.""",
       arguments: {'lexeme': token});
 }
 
@@ -2550,7 +2602,7 @@
         String
             name)> templateDuplicatedNamePreviouslyUsed = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Can't declare '#name' because it was already used in this scope.""",
     withArguments: _withArgumentsDuplicatedNamePreviouslyUsed);
 
@@ -2564,7 +2616,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedNamePreviouslyUsed,
-      message:
+      problemMessage:
           """Can't declare '${name}' because it was already used in this scope.""",
       arguments: {'name': name});
 }
@@ -2573,7 +2625,7 @@
 const Template<Message Function(String name)>
     templateDuplicatedNamePreviouslyUsedCause =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Previous use of '#name'.""",
+        problemMessageTemplate: r"""Previous use of '#name'.""",
         withArguments: _withArgumentsDuplicatedNamePreviouslyUsedCause);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2588,13 +2640,14 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedNamePreviouslyUsedCause,
-      message: """Previous use of '${name}'.""", arguments: {'name': name});
+      problemMessage: """Previous use of '${name}'.""",
+      arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateDuplicatedNamedArgument =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Duplicated named argument '#name'.""",
+        problemMessageTemplate: r"""Duplicated named argument '#name'.""",
         withArguments: _withArgumentsDuplicatedNamedArgument);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2607,14 +2660,14 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedNamedArgument,
-      message: """Duplicated named argument '${name}'.""",
+      problemMessage: """Duplicated named argument '${name}'.""",
       arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateDuplicatedParameterName =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Duplicated parameter name '#name'.""",
+        problemMessageTemplate: r"""Duplicated parameter name '#name'.""",
         withArguments: _withArgumentsDuplicatedParameterName);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2627,7 +2680,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedParameterName,
-      message: """Duplicated parameter name '${name}'.""",
+      problemMessage: """Duplicated parameter name '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -2635,7 +2688,7 @@
 const Template<Message Function(String name)>
     templateDuplicatedParameterNameCause =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Other parameter named '#name'.""",
+        problemMessageTemplate: r"""Other parameter named '#name'.""",
         withArguments: _withArgumentsDuplicatedParameterNameCause);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2648,7 +2701,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeDuplicatedParameterNameCause,
-      message: """Other parameter named '${name}'.""",
+      problemMessage: """Other parameter named '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -2659,8 +2712,8 @@
 const MessageCode messageEmptyNamedParameterList = const MessageCode(
     "EmptyNamedParameterList",
     analyzerCodes: <String>["MISSING_IDENTIFIER"],
-    message: r"""Named parameter lists cannot be empty.""",
-    tip: r"""Try adding a named parameter to the list.""");
+    problemMessage: r"""Named parameter lists cannot be empty.""",
+    correctionMessage: r"""Try adding a named parameter to the list.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeEmptyOptionalParameterList =
@@ -2670,15 +2723,15 @@
 const MessageCode messageEmptyOptionalParameterList = const MessageCode(
     "EmptyOptionalParameterList",
     analyzerCodes: <String>["MISSING_IDENTIFIER"],
-    message: r"""Optional parameter lists cannot be empty.""",
-    tip: r"""Try adding an optional parameter to the list.""");
+    problemMessage: r"""Optional parameter lists cannot be empty.""",
+    correctionMessage: r"""Try adding an optional parameter to the list.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeEncoding = messageEncoding;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageEncoding = const MessageCode("Encoding",
-    message: r"""Unable to decode bytes as UTF-8.""");
+    problemMessage: r"""Unable to decode bytes as UTF-8.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -2686,7 +2739,7 @@
         String
             name)> templateEnumConstantSameNameAsEnclosing = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Name of enum constant '#name' can't be the same as the enum's own name.""",
     withArguments: _withArgumentsEnumConstantSameNameAsEnclosing);
 
@@ -2700,7 +2753,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeEnumConstantSameNameAsEnclosing,
-      message:
+      problemMessage:
           """Name of enum constant '${name}' can't be the same as the enum's own name.""",
       arguments: {'name': name});
 }
@@ -2712,7 +2765,7 @@
 const MessageCode messageEnumDeclarationEmpty = const MessageCode(
     "EnumDeclarationEmpty",
     analyzerCodes: <String>["EMPTY_ENUM_BODY"],
-    message: r"""An enum declaration can't be empty.""");
+    problemMessage: r"""An enum declaration can't be empty.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeEnumInClass = messageEnumInClass;
@@ -2720,8 +2773,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageEnumInClass = const MessageCode("EnumInClass",
     index: 74,
-    message: r"""Enums can't be declared inside classes.""",
-    tip: r"""Try moving the enum to the top-level.""");
+    problemMessage: r"""Enums can't be declared inside classes.""",
+    correctionMessage: r"""Try moving the enum to the top-level.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeEnumInstantiation = messageEnumInstantiation;
@@ -2730,7 +2783,7 @@
 const MessageCode messageEnumInstantiation = const MessageCode(
     "EnumInstantiation",
     analyzerCodes: <String>["INSTANTIATE_ENUM"],
-    message: r"""Enums can't be instantiated.""");
+    problemMessage: r"""Enums can't be instantiated.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeEqualityCannotBeEqualityOperand =
@@ -2740,15 +2793,16 @@
 const MessageCode messageEqualityCannotBeEqualityOperand = const MessageCode(
     "EqualityCannotBeEqualityOperand",
     index: 1,
-    message:
+    problemMessage:
         r"""A comparison expression can't be an operand of another comparison expression.""",
-    tip: r"""Try putting parentheses around one of the comparisons.""");
+    correctionMessage:
+        r"""Try putting parentheses around one of the comparisons.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Uri uri_, String string)>
     templateExceptionReadingFile =
     const Template<Message Function(Uri uri_, String string)>(
-        messageTemplate: r"""Exception when reading '#uri': #string""",
+        problemMessageTemplate: r"""Exception when reading '#uri': #string""",
         withArguments: _withArgumentsExceptionReadingFile);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2762,14 +2816,14 @@
   String? uri = relativizeUri(uri_);
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeExceptionReadingFile,
-      message: """Exception when reading '${uri}': ${string}""",
+      problemMessage: """Exception when reading '${uri}': ${string}""",
       arguments: {'uri': uri_, 'string': string});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string)> templateExpectedAfterButGot =
     const Template<Message Function(String string)>(
-        messageTemplate: r"""Expected '#string' after this.""",
+        problemMessageTemplate: r"""Expected '#string' after this.""",
         withArguments: _withArgumentsExpectedAfterButGot);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2781,7 +2835,7 @@
 Message _withArgumentsExpectedAfterButGot(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeExpectedAfterButGot,
-      message: """Expected '${string}' after this.""",
+      problemMessage: """Expected '${string}' after this.""",
       arguments: {'string': string});
 }
 
@@ -2792,7 +2846,7 @@
 const MessageCode messageExpectedAnInitializer = const MessageCode(
     "ExpectedAnInitializer",
     index: 36,
-    message: r"""Expected an initializer.""");
+    problemMessage: r"""Expected an initializer.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExpectedBlock = messageExpectedBlock;
@@ -2800,8 +2854,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExpectedBlock = const MessageCode("ExpectedBlock",
     analyzerCodes: <String>["EXPECTED_TOKEN"],
-    message: r"""Expected a block.""",
-    tip: r"""Try adding {}.""");
+    problemMessage: r"""Expected a block.""",
+    correctionMessage: r"""Try adding {}.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExpectedBlockToSkip = messageExpectedBlockToSkip;
@@ -2810,8 +2864,8 @@
 const MessageCode messageExpectedBlockToSkip = const MessageCode(
     "ExpectedBlockToSkip",
     analyzerCodes: <String>["MISSING_FUNCTION_BODY"],
-    message: r"""Expected a function body or '=>'.""",
-    tip: r"""Try adding {}.""");
+    problemMessage: r"""Expected a function body or '=>'.""",
+    correctionMessage: r"""Try adding {}.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExpectedBody = messageExpectedBody;
@@ -2819,13 +2873,13 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExpectedBody = const MessageCode("ExpectedBody",
     analyzerCodes: <String>["MISSING_FUNCTION_BODY"],
-    message: r"""Expected a function body or '=>'.""",
-    tip: r"""Try adding {}.""");
+    problemMessage: r"""Expected a function body or '=>'.""",
+    correctionMessage: r"""Try adding {}.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string)> templateExpectedButGot =
     const Template<Message Function(String string)>(
-        messageTemplate: r"""Expected '#string' before this.""",
+        problemMessageTemplate: r"""Expected '#string' before this.""",
         withArguments: _withArgumentsExpectedButGot);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2837,14 +2891,15 @@
 Message _withArgumentsExpectedButGot(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeExpectedButGot,
-      message: """Expected '${string}' before this.""",
+      problemMessage: """Expected '${string}' before this.""",
       arguments: {'string': string});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateExpectedClassMember =
     const Template<Message Function(Token token)>(
-        messageTemplate: r"""Expected a class member, but got '#lexeme'.""",
+        problemMessageTemplate:
+            r"""Expected a class member, but got '#lexeme'.""",
         withArguments: _withArgumentsExpectedClassMember);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2856,7 +2911,7 @@
 Message _withArgumentsExpectedClassMember(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeExpectedClassMember,
-      message: """Expected a class member, but got '${lexeme}'.""",
+      problemMessage: """Expected a class member, but got '${lexeme}'.""",
       arguments: {'lexeme': token});
 }
 
@@ -2864,9 +2919,9 @@
 const Template<Message Function(String string)>
     templateExpectedClassOrMixinBody =
     const Template<Message Function(String string)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""A #string must have a body, even if it is empty.""",
-        tipTemplate: r"""Try adding an empty body.""",
+        correctionMessageTemplate: r"""Try adding an empty body.""",
         withArguments: _withArgumentsExpectedClassOrMixinBody);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2878,15 +2933,16 @@
 Message _withArgumentsExpectedClassOrMixinBody(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeExpectedClassOrMixinBody,
-      message: """A ${string} must have a body, even if it is empty.""",
-      tip: """Try adding an empty body.""",
+      problemMessage: """A ${string} must have a body, even if it is empty.""",
+      correctionMessage: """Try adding an empty body.""",
       arguments: {'string': string});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateExpectedDeclaration =
     const Template<Message Function(Token token)>(
-        messageTemplate: r"""Expected a declaration, but got '#lexeme'.""",
+        problemMessageTemplate:
+            r"""Expected a declaration, but got '#lexeme'.""",
         withArguments: _withArgumentsExpectedDeclaration);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2898,7 +2954,7 @@
 Message _withArgumentsExpectedDeclaration(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeExpectedDeclaration,
-      message: """Expected a declaration, but got '${lexeme}'.""",
+      problemMessage: """Expected a declaration, but got '${lexeme}'.""",
       arguments: {'lexeme': token});
 }
 
@@ -2909,14 +2965,14 @@
 const MessageCode messageExpectedElseOrComma = const MessageCode(
     "ExpectedElseOrComma",
     index: 46,
-    message: r"""Expected 'else' or comma.""");
+    problemMessage: r"""Expected 'else' or comma.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(Token token)> templateExpectedEnumBody = const Template<
         Message Function(Token token)>(
-    messageTemplate: r"""Expected a enum body, but got '#lexeme'.""",
-    tipTemplate:
+    problemMessageTemplate: r"""Expected a enum body, but got '#lexeme'.""",
+    correctionMessageTemplate:
         r"""An enum definition must have a body with at least one constant name.""",
     withArguments: _withArgumentsExpectedEnumBody);
 
@@ -2929,8 +2985,8 @@
 Message _withArgumentsExpectedEnumBody(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeExpectedEnumBody,
-      message: """Expected a enum body, but got '${lexeme}'.""",
-      tip:
+      problemMessage: """Expected a enum body, but got '${lexeme}'.""",
+      correctionMessage:
           """An enum definition must have a body with at least one constant name.""",
       arguments: {'lexeme': token});
 }
@@ -2938,7 +2994,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateExpectedFunctionBody =
     const Template<Message Function(Token token)>(
-        messageTemplate: r"""Expected a function body, but got '#lexeme'.""",
+        problemMessageTemplate:
+            r"""Expected a function body, but got '#lexeme'.""",
         withArguments: _withArgumentsExpectedFunctionBody);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2950,7 +3007,7 @@
 Message _withArgumentsExpectedFunctionBody(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeExpectedFunctionBody,
-      message: """Expected a function body, but got '${lexeme}'.""",
+      problemMessage: """Expected a function body, but got '${lexeme}'.""",
       arguments: {'lexeme': token});
 }
 
@@ -2961,13 +3018,15 @@
 const MessageCode messageExpectedHexDigit = const MessageCode(
     "ExpectedHexDigit",
     analyzerCodes: <String>["MISSING_HEX_DIGIT"],
-    message: r"""A hex digit (0-9 or A-F) must follow '0x'.""");
+    problemMessage: r"""A hex digit (0-9 or A-F) must follow '0x'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateExpectedIdentifier =
     const Template<Message Function(Token token)>(
-        messageTemplate: r"""Expected an identifier, but got '#lexeme'.""",
-        tipTemplate: r"""Try inserting an identifier before '#lexeme'.""",
+        problemMessageTemplate:
+            r"""Expected an identifier, but got '#lexeme'.""",
+        correctionMessageTemplate:
+            r"""Try inserting an identifier before '#lexeme'.""",
         withArguments: _withArgumentsExpectedIdentifier);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2979,8 +3038,8 @@
 Message _withArgumentsExpectedIdentifier(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeExpectedIdentifier,
-      message: """Expected an identifier, but got '${lexeme}'.""",
-      tip: """Try inserting an identifier before '${lexeme}'.""",
+      problemMessage: """Expected an identifier, but got '${lexeme}'.""",
+      correctionMessage: """Try inserting an identifier before '${lexeme}'.""",
       arguments: {'lexeme': token});
 }
 
@@ -2989,11 +3048,10 @@
     Message Function(
         Token
             token)> templateExpectedIdentifierButGotKeyword = const Template<
-        Message Function(
-            Token token)>(
-    messageTemplate:
+        Message Function(Token token)>(
+    problemMessageTemplate:
         r"""'#lexeme' can't be used as an identifier because it's a keyword.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try renaming this to be an identifier that isn't a keyword.""",
     withArguments: _withArgumentsExpectedIdentifierButGotKeyword);
 
@@ -3006,16 +3064,16 @@
 Message _withArgumentsExpectedIdentifierButGotKeyword(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeExpectedIdentifierButGotKeyword,
-      message:
+      problemMessage:
           """'${lexeme}' can't be used as an identifier because it's a keyword.""",
-      tip: """Try renaming this to be an identifier that isn't a keyword.""",
+      correctionMessage: """Try renaming this to be an identifier that isn't a keyword.""",
       arguments: {'lexeme': token});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string)> templateExpectedInstead =
     const Template<Message Function(String string)>(
-        messageTemplate: r"""Expected '#string' instead of this.""",
+        problemMessageTemplate: r"""Expected '#string' instead of this.""",
         withArguments: _withArgumentsExpectedInstead);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3026,7 +3084,7 @@
 Message _withArgumentsExpectedInstead(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeExpectedInstead,
-      message: """Expected '${string}' instead of this.""",
+      problemMessage: """Expected '${string}' instead of this.""",
       arguments: {'string': string});
 }
 
@@ -3037,7 +3095,7 @@
 const MessageCode messageExpectedNamedArgument = const MessageCode(
     "ExpectedNamedArgument",
     analyzerCodes: <String>["EXTRA_POSITIONAL_ARGUMENTS"],
-    message: r"""Expected named argument.""");
+    problemMessage: r"""Expected named argument.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExpectedOneExpression = messageExpectedOneExpression;
@@ -3045,14 +3103,16 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExpectedOneExpression = const MessageCode(
     "ExpectedOneExpression",
-    message: r"""Expected one expression, but found additional input.""");
+    problemMessage:
+        r"""Expected one expression, but found additional input.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExpectedOpenParens = messageExpectedOpenParens;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageExpectedOpenParens =
-    const MessageCode("ExpectedOpenParens", message: r"""Expected '('.""");
+const MessageCode messageExpectedOpenParens = const MessageCode(
+    "ExpectedOpenParens",
+    problemMessage: r"""Expected '('.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExpectedStatement = messageExpectedStatement;
@@ -3061,12 +3121,12 @@
 const MessageCode messageExpectedStatement = const MessageCode(
     "ExpectedStatement",
     index: 29,
-    message: r"""Expected a statement.""");
+    problemMessage: r"""Expected a statement.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateExpectedString =
     const Template<Message Function(Token token)>(
-        messageTemplate: r"""Expected a String, but got '#lexeme'.""",
+        problemMessageTemplate: r"""Expected a String, but got '#lexeme'.""",
         withArguments: _withArgumentsExpectedString);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3078,14 +3138,14 @@
 Message _withArgumentsExpectedString(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeExpectedString,
-      message: """Expected a String, but got '${lexeme}'.""",
+      problemMessage: """Expected a String, but got '${lexeme}'.""",
       arguments: {'lexeme': token});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string)> templateExpectedToken =
     const Template<Message Function(String string)>(
-        messageTemplate: r"""Expected to find '#string'.""",
+        problemMessageTemplate: r"""Expected to find '#string'.""",
         withArguments: _withArgumentsExpectedToken);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3097,14 +3157,14 @@
 Message _withArgumentsExpectedToken(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeExpectedToken,
-      message: """Expected to find '${string}'.""",
+      problemMessage: """Expected to find '${string}'.""",
       arguments: {'string': string});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateExpectedType =
     const Template<Message Function(Token token)>(
-        messageTemplate: r"""Expected a type, but got '#lexeme'.""",
+        problemMessageTemplate: r"""Expected a type, but got '#lexeme'.""",
         withArguments: _withArgumentsExpectedType);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3116,7 +3176,7 @@
 Message _withArgumentsExpectedType(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeExpectedType,
-      message: """Expected a type, but got '${lexeme}'.""",
+      problemMessage: """Expected a type, but got '${lexeme}'.""",
       arguments: {'lexeme': token});
 }
 
@@ -3125,7 +3185,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExpectedUri =
-    const MessageCode("ExpectedUri", message: r"""Expected a URI.""");
+    const MessageCode("ExpectedUri", problemMessage: r"""Expected a URI.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -3133,9 +3193,9 @@
         String
             string)> templateExperimentDisabled = const Template<
         Message Function(String string)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""This requires the '#string' language feature to be enabled.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-#string' command line option is passed.""",
     withArguments: _withArgumentsExperimentDisabled);
 
@@ -3148,9 +3208,9 @@
 Message _withArgumentsExperimentDisabled(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeExperimentDisabled,
-      message:
+      problemMessage:
           """This requires the '${string}' language feature to be enabled.""",
-      tip:
+      correctionMessage:
           """The feature is on by default but is currently disabled, maybe because the '--enable-experiment=no-${string}' command line option is passed.""",
       arguments: {'string': string});
 }
@@ -3159,7 +3219,7 @@
 const Template<Message Function(String string2)>
     templateExperimentDisabledInvalidLanguageVersion =
     const Template<Message Function(String string2)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""This requires the null safety language feature, which requires language version of #string2 or higher.""",
         withArguments: _withArgumentsExperimentDisabledInvalidLanguageVersion);
 
@@ -3174,7 +3234,7 @@
 Message _withArgumentsExperimentDisabledInvalidLanguageVersion(String string2) {
   if (string2.isEmpty) throw 'No string provided';
   return new Message(codeExperimentDisabledInvalidLanguageVersion,
-      message:
+      problemMessage:
           """This requires the null safety language feature, which requires language version of ${string2} or higher.""",
       arguments: {'string2': string2});
 }
@@ -3186,9 +3246,9 @@
         String
             string2)> templateExperimentNotEnabled = const Template<
         Message Function(String string, String string2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""This requires the '#string' language feature to be enabled.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try updating your pubspec.yaml to set the minimum SDK constraint to #string2 or higher, and running 'pub get'.""",
     withArguments: _withArgumentsExperimentNotEnabled);
 
@@ -3204,9 +3264,9 @@
   if (string.isEmpty) throw 'No string provided';
   if (string2.isEmpty) throw 'No string provided';
   return new Message(codeExperimentNotEnabled,
-      message:
+      problemMessage:
           """This requires the '${string}' language feature to be enabled.""",
-      tip:
+      correctionMessage:
           """Try updating your pubspec.yaml to set the minimum SDK constraint to ${string2} or higher, and running 'pub get'.""",
       arguments: {'string': string, 'string2': string2});
 }
@@ -3219,18 +3279,18 @@
 const MessageCode messageExperimentNotEnabledNoFlag = const MessageCode(
     "ExperimentNotEnabledNoFlag",
     analyzerCodes: <String>["ParserErrorCode.EXPERIMENT_NOT_ENABLED"],
-    message:
+    problemMessage:
         r"""This requires the null safety language feature, which is experimental.""",
-    tip:
+    correctionMessage:
         r"""You can enable the experiment using the '--enable-experiment=non-nullable' command line option.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string2)>
     templateExperimentNotEnabledNoFlagInvalidLanguageVersion =
     const Template<Message Function(String string2)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""This requires the null safety language feature, which is experimental and requires language version of #string2 or higher.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""You can enable the experiment using the '--enable-experiment=non-nullable' command line option.""",
         withArguments:
             _withArgumentsExperimentNotEnabledNoFlagInvalidLanguageVersion);
@@ -3247,9 +3307,9 @@
     String string2) {
   if (string2.isEmpty) throw 'No string provided';
   return new Message(codeExperimentNotEnabledNoFlagInvalidLanguageVersion,
-      message:
+      problemMessage:
           """This requires the null safety language feature, which is experimental and requires language version of ${string2} or higher.""",
-      tip: """You can enable the experiment using the '--enable-experiment=non-nullable' command line option.""",
+      correctionMessage: """You can enable the experiment using the '--enable-experiment=non-nullable' command line option.""",
       arguments: {'string2': string2});
 }
 
@@ -3260,7 +3320,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExplicitExtensionArgumentMismatch = const MessageCode(
     "ExplicitExtensionArgumentMismatch",
-    message:
+    problemMessage:
         r"""Explicit extension application requires exactly 1 positional argument.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3270,7 +3330,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExplicitExtensionAsExpression = const MessageCode(
     "ExplicitExtensionAsExpression",
-    message:
+    problemMessage:
         r"""Explicit extension application cannot be used as an expression.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3280,7 +3340,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExplicitExtensionAsLvalue = const MessageCode(
     "ExplicitExtensionAsLvalue",
-    message:
+    problemMessage:
         r"""Explicit extension application cannot be a target for assignment.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3290,7 +3350,7 @@
         int
             count)> templateExplicitExtensionTypeArgumentMismatch = const Template<
         Message Function(String name, int count)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Explicit extension application of extension '#name' takes '#count' type argument(s).""",
     withArguments: _withArgumentsExplicitExtensionTypeArgumentMismatch);
 
@@ -3309,7 +3369,7 @@
   // ignore: unnecessary_null_comparison
   if (count == null) throw 'No count provided';
   return new Message(codeExplicitExtensionTypeArgumentMismatch,
-      message:
+      problemMessage:
           """Explicit extension application of extension '${name}' takes '${count}' type argument(s).""",
       arguments: {'name': name, 'count': count});
 }
@@ -3320,8 +3380,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExportAfterPart = const MessageCode("ExportAfterPart",
     index: 75,
-    message: r"""Export directives must precede part directives.""",
-    tip: r"""Try moving the export directives before the part directives.""");
+    problemMessage: r"""Export directives must precede part directives.""",
+    correctionMessage:
+        r"""Try moving the export directives before the part directives.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExportOptOutFromOptIn = messageExportOptOutFromOptIn;
@@ -3329,7 +3390,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExportOptOutFromOptIn = const MessageCode(
     "ExportOptOutFromOptIn",
-    message:
+    problemMessage:
         r"""Null safe libraries are not allowed to export declarations from of opt-out libraries.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3338,7 +3399,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExportedMain = const MessageCode("ExportedMain",
     severity: Severity.context,
-    message: r"""This is exported 'main' declaration.""");
+    problemMessage: r"""This is exported 'main' declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExpressionNotMetadata = messageExpressionNotMetadata;
@@ -3346,7 +3407,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExpressionNotMetadata = const MessageCode(
     "ExpressionNotMetadata",
-    message:
+    problemMessage:
         r"""This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3355,13 +3416,14 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExtendFunction = const MessageCode("ExtendFunction",
     severity: Severity.ignored,
-    message: r"""Extending 'Function' is deprecated.""",
-    tip: r"""Try removing 'Function' from the 'extends' clause.""");
+    problemMessage: r"""Extending 'Function' is deprecated.""",
+    correctionMessage:
+        r"""Try removing 'Function' from the 'extends' clause.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateExtendingEnum =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""'#name' is an enum and can't be extended or implemented.""",
         withArguments: _withArgumentsExtendingEnum);
 
@@ -3375,14 +3437,15 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeExtendingEnum,
-      message: """'${name}' is an enum and can't be extended or implemented.""",
+      problemMessage:
+          """'${name}' is an enum and can't be extended or implemented.""",
       arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateExtendingRestricted =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""'#name' is restricted and can't be extended or implemented.""",
         withArguments: _withArgumentsExtendingRestricted);
 
@@ -3396,7 +3459,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeExtendingRestricted,
-      message:
+      problemMessage:
           """'${name}' is restricted and can't be extended or implemented.""",
       arguments: {'name': name});
 }
@@ -3406,21 +3469,24 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExtendsFutureOr = const MessageCode("ExtendsFutureOr",
-    message: r"""The type 'FutureOr' can't be used in an 'extends' clause.""");
+    problemMessage:
+        r"""The type 'FutureOr' can't be used in an 'extends' clause.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExtendsNever = messageExtendsNever;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExtendsNever = const MessageCode("ExtendsNever",
-    message: r"""The type 'Never' can't be used in an 'extends' clause.""");
+    problemMessage:
+        r"""The type 'Never' can't be used in an 'extends' clause.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExtendsVoid = messageExtendsVoid;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExtendsVoid = const MessageCode("ExtendsVoid",
-    message: r"""The type 'void' can't be used in an 'extends' clause.""");
+    problemMessage:
+        r"""The type 'void' can't be used in an 'extends' clause.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExtensionDeclaresAbstractMember =
@@ -3430,8 +3496,8 @@
 const MessageCode messageExtensionDeclaresAbstractMember = const MessageCode(
     "ExtensionDeclaresAbstractMember",
     index: 94,
-    message: r"""Extensions can't declare abstract members.""",
-    tip: r"""Try providing an implementation for the member.""");
+    problemMessage: r"""Extensions can't declare abstract members.""",
+    correctionMessage: r"""Try providing an implementation for the member.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExtensionDeclaresConstructor =
@@ -3441,8 +3507,8 @@
 const MessageCode messageExtensionDeclaresConstructor = const MessageCode(
     "ExtensionDeclaresConstructor",
     index: 92,
-    message: r"""Extensions can't declare constructors.""",
-    tip: r"""Try removing the constructor declaration.""");
+    problemMessage: r"""Extensions can't declare constructors.""",
+    correctionMessage: r"""Try removing the constructor declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExtensionDeclaresInstanceField =
@@ -3452,14 +3518,15 @@
 const MessageCode messageExtensionDeclaresInstanceField = const MessageCode(
     "ExtensionDeclaresInstanceField",
     index: 93,
-    message: r"""Extensions can't declare instance fields""",
-    tip: r"""Try removing the field declaration or making it a static field""");
+    problemMessage: r"""Extensions can't declare instance fields""",
+    correctionMessage:
+        r"""Try removing the field declaration or making it a static field""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateExtensionMemberConflictsWithObjectMember =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""This extension member conflicts with Object member '#name'.""",
         withArguments: _withArgumentsExtensionMemberConflictsWithObjectMember);
 
@@ -3475,7 +3542,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeExtensionMemberConflictsWithObjectMember,
-      message:
+      problemMessage:
           """This extension member conflicts with Object member '${name}'.""",
       arguments: {'name': name});
 }
@@ -3486,8 +3553,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalClass = const MessageCode("ExternalClass",
     index: 3,
-    message: r"""Classes can't be declared to be 'external'.""",
-    tip: r"""Try removing the keyword 'external'.""");
+    problemMessage: r"""Classes can't be declared to be 'external'.""",
+    correctionMessage: r"""Try removing the keyword 'external'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExternalConstructorWithBody =
@@ -3497,8 +3564,8 @@
 const MessageCode messageExternalConstructorWithBody = const MessageCode(
     "ExternalConstructorWithBody",
     index: 87,
-    message: r"""External constructors can't have a body.""",
-    tip:
+    problemMessage: r"""External constructors can't have a body.""",
+    correctionMessage:
         r"""Try removing the body of the constructor, or removing the keyword 'external'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3509,8 +3576,8 @@
 const MessageCode messageExternalConstructorWithFieldInitializers =
     const MessageCode("ExternalConstructorWithFieldInitializers",
         analyzerCodes: <String>["EXTERNAL_CONSTRUCTOR_WITH_FIELD_INITIALIZERS"],
-        message: r"""An external constructor can't initialize fields.""",
-        tip:
+        problemMessage: r"""An external constructor can't initialize fields.""",
+        correctionMessage:
             r"""Try removing the field initializers, or removing the keyword 'external'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3521,7 +3588,8 @@
 const MessageCode messageExternalConstructorWithInitializer = const MessageCode(
     "ExternalConstructorWithInitializer",
     index: 106,
-    message: r"""An external constructor can't have any initializers.""");
+    problemMessage:
+        r"""An external constructor can't have any initializers.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExternalEnum = messageExternalEnum;
@@ -3529,8 +3597,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalEnum = const MessageCode("ExternalEnum",
     index: 5,
-    message: r"""Enums can't be declared to be 'external'.""",
-    tip: r"""Try removing the keyword 'external'.""");
+    problemMessage: r"""Enums can't be declared to be 'external'.""",
+    correctionMessage: r"""Try removing the keyword 'external'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExternalFactoryRedirection =
@@ -3540,8 +3608,8 @@
 const MessageCode messageExternalFactoryRedirection = const MessageCode(
     "ExternalFactoryRedirection",
     index: 85,
-    message: r"""A redirecting factory can't be external.""",
-    tip: r"""Try removing the 'external' modifier.""");
+    problemMessage: r"""A redirecting factory can't be external.""",
+    correctionMessage: r"""Try removing the 'external' modifier.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExternalFactoryWithBody = messageExternalFactoryWithBody;
@@ -3550,8 +3618,8 @@
 const MessageCode messageExternalFactoryWithBody = const MessageCode(
     "ExternalFactoryWithBody",
     index: 86,
-    message: r"""External factories can't have a body.""",
-    tip:
+    problemMessage: r"""External factories can't have a body.""",
+    correctionMessage:
         r"""Try removing the body of the factory, or removing the keyword 'external'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3560,8 +3628,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalField = const MessageCode("ExternalField",
     index: 50,
-    message: r"""Fields can't be declared to be 'external'.""",
-    tip:
+    problemMessage: r"""Fields can't be declared to be 'external'.""",
+    correctionMessage:
         r"""Try removing the keyword 'external', or replacing the field by an external getter and/or setter.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3571,8 +3639,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalFieldConstructorInitializer = const MessageCode(
     "ExternalFieldConstructorInitializer",
-    message: r"""External fields cannot have initializers.""",
-    tip:
+    problemMessage: r"""External fields cannot have initializers.""",
+    correctionMessage:
         r"""Try removing the field initializer or the 'external' keyword from the field declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3581,8 +3649,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalFieldInitializer = const MessageCode(
     "ExternalFieldInitializer",
-    message: r"""External fields cannot have initializers.""",
-    tip: r"""Try removing the initializer or the 'external' keyword.""");
+    problemMessage: r"""External fields cannot have initializers.""",
+    correctionMessage:
+        r"""Try removing the initializer or the 'external' keyword.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExternalLateField = messageExternalLateField;
@@ -3591,8 +3660,8 @@
 const MessageCode messageExternalLateField = const MessageCode(
     "ExternalLateField",
     index: 109,
-    message: r"""External fields cannot be late.""",
-    tip: r"""Try removing the 'external' or 'late' keyword.""");
+    problemMessage: r"""External fields cannot be late.""",
+    correctionMessage: r"""Try removing the 'external' or 'late' keyword.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExternalMethodWithBody = messageExternalMethodWithBody;
@@ -3601,7 +3670,7 @@
 const MessageCode messageExternalMethodWithBody = const MessageCode(
     "ExternalMethodWithBody",
     index: 49,
-    message: r"""An external or native method can't have a body.""");
+    problemMessage: r"""An external or native method can't have a body.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeExternalTypedef = messageExternalTypedef;
@@ -3609,14 +3678,14 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalTypedef = const MessageCode("ExternalTypedef",
     index: 76,
-    message: r"""Typedefs can't be declared to be 'external'.""",
-    tip: r"""Try removing the keyword 'external'.""");
+    problemMessage: r"""Typedefs can't be declared to be 'external'.""",
+    correctionMessage: r"""Try removing the keyword 'external'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateExtraneousModifier =
     const Template<Message Function(Token token)>(
-        messageTemplate: r"""Can't have modifier '#lexeme' here.""",
-        tipTemplate: r"""Try removing '#lexeme'.""",
+        problemMessageTemplate: r"""Can't have modifier '#lexeme' here.""",
+        correctionMessageTemplate: r"""Try removing '#lexeme'.""",
         withArguments: _withArgumentsExtraneousModifier);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3627,8 +3696,8 @@
 Message _withArgumentsExtraneousModifier(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeExtraneousModifier,
-      message: """Can't have modifier '${lexeme}' here.""",
-      tip: """Try removing '${lexeme}'.""",
+      problemMessage: """Can't have modifier '${lexeme}' here.""",
+      correctionMessage: """Try removing '${lexeme}'.""",
       arguments: {'lexeme': token});
 }
 
@@ -3636,8 +3705,9 @@
 const Template<Message Function(Token token)>
     templateExtraneousModifierInExtension =
     const Template<Message Function(Token token)>(
-        messageTemplate: r"""Can't have modifier '#lexeme' in an extension.""",
-        tipTemplate: r"""Try removing '#lexeme'.""",
+        problemMessageTemplate:
+            r"""Can't have modifier '#lexeme' in an extension.""",
+        correctionMessageTemplate: r"""Try removing '#lexeme'.""",
         withArguments: _withArgumentsExtraneousModifierInExtension);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3649,8 +3719,8 @@
 Message _withArgumentsExtraneousModifierInExtension(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeExtraneousModifierInExtension,
-      message: """Can't have modifier '${lexeme}' in an extension.""",
-      tip: """Try removing '${lexeme}'.""",
+      problemMessage: """Can't have modifier '${lexeme}' in an extension.""",
+      correctionMessage: """Try removing '${lexeme}'.""",
       arguments: {'lexeme': token});
 }
 
@@ -3660,7 +3730,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFactoryNotSync = const MessageCode("FactoryNotSync",
     analyzerCodes: <String>["NON_SYNC_FACTORY"],
-    message: r"""Factory bodies can't use 'async', 'async*', or 'sync*'.""");
+    problemMessage:
+        r"""Factory bodies can't use 'async', 'async*', or 'sync*'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeFactoryTopLevelDeclaration =
@@ -3670,13 +3741,14 @@
 const MessageCode messageFactoryTopLevelDeclaration = const MessageCode(
     "FactoryTopLevelDeclaration",
     index: 78,
-    message: r"""Top-level declarations can't be declared to be 'factory'.""",
-    tip: r"""Try removing the keyword 'factory'.""");
+    problemMessage:
+        r"""Top-level declarations can't be declared to be 'factory'.""",
+    correctionMessage: r"""Try removing the keyword 'factory'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateFastaCLIArgumentRequired =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Expected value after '#name'.""",
+        problemMessageTemplate: r"""Expected value after '#name'.""",
         withArguments: _withArgumentsFastaCLIArgumentRequired);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3690,7 +3762,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFastaCLIArgumentRequired,
-      message: """Expected value after '${name}'.""",
+      problemMessage: """Expected value after '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -3699,7 +3771,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFastaUsageLong =
-    const MessageCode("FastaUsageLong", message: r"""Supported options:
+    const MessageCode("FastaUsageLong", problemMessage: r"""Supported options:
 
   -o <file>, --output=<file>
     Generate the output into <file>.
@@ -3789,8 +3861,8 @@
 const Code<Null> codeFastaUsageShort = messageFastaUsageShort;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageFastaUsageShort =
-    const MessageCode("FastaUsageShort", message: r"""Frequently used options:
+const MessageCode messageFastaUsageShort = const MessageCode("FastaUsageShort",
+    problemMessage: r"""Frequently used options:
 
   -o <file> Generate the output into <file>.
   -h        Display this message (add -v for information about all options).""");
@@ -3802,7 +3874,7 @@
         String
             name)> templateFfiEmptyStruct = const Template<
         Message Function(String string, String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""#string '#name' is empty. Empty structs and unions are undefined behavior.""",
     withArguments: _withArgumentsFfiEmptyStruct);
 
@@ -3818,7 +3890,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFfiEmptyStruct,
-      message:
+      problemMessage:
           """${string} '${name}' is empty. Empty structs and unions are undefined behavior.""",
       arguments: {'string': string, 'name': name});
 }
@@ -3829,7 +3901,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFfiExceptionalReturnNull = const MessageCode(
     "FfiExceptionalReturnNull",
-    message: r"""Exceptional return value must not be null.""");
+    problemMessage: r"""Exceptional return value must not be null.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeFfiExpectedConstant = messageFfiExpectedConstant;
@@ -3837,12 +3909,12 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFfiExpectedConstant = const MessageCode(
     "FfiExpectedConstant",
-    message: r"""Exceptional return value must be a constant.""");
+    problemMessage: r"""Exceptional return value must be a constant.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateFfiExpectedConstantArg =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Argument '#name' must be a constant.""",
+        problemMessageTemplate: r"""Argument '#name' must be a constant.""",
         withArguments: _withArgumentsFfiExpectedConstantArg);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3856,7 +3928,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFfiExpectedConstantArg,
-      message: """Argument '${name}' must be a constant.""",
+      problemMessage: """Argument '${name}' must be a constant.""",
       arguments: {'name': name});
 }
 
@@ -3864,7 +3936,7 @@
 const Template<Message Function(String name)>
     templateFfiExtendsOrImplementsSealedClass =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Class '#name' cannot be extended or implemented.""",
         withArguments: _withArgumentsFfiExtendsOrImplementsSealedClass);
 
@@ -3880,7 +3952,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFfiExtendsOrImplementsSealedClass,
-      message: """Class '${name}' cannot be extended or implemented.""",
+      problemMessage: """Class '${name}' cannot be extended or implemented.""",
       arguments: {'name': name});
 }
 
@@ -3888,7 +3960,7 @@
 const Template<
     Message Function(String name)> templateFfiFieldAnnotation = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Field '#name' requires exactly one annotation to declare its native type, which cannot be Void. dart:ffi Structs and Unions cannot have regular Dart fields.""",
     withArguments: _withArgumentsFfiFieldAnnotation);
 
@@ -3903,7 +3975,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFfiFieldAnnotation,
-      message:
+      problemMessage:
           """Field '${name}' requires exactly one annotation to declare its native type, which cannot be Void. dart:ffi Structs and Unions cannot have regular Dart fields.""",
       arguments: {'name': name});
 }
@@ -3913,8 +3985,10 @@
         Message Function(String string, String name, List<String> _names)>
     templateFfiFieldCyclic = const Template<
             Message Function(String string, String name, List<String> _names)>(
-        messageTemplate: r"""#string '#name' contains itself. Cycle elements:
-#names""", withArguments: _withArgumentsFfiFieldCyclic);
+        problemMessageTemplate:
+            r"""#string '#name' contains itself. Cycle elements:
+#names""",
+        withArguments: _withArgumentsFfiFieldCyclic);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String string, String name, List<String> _names)>
@@ -3932,7 +4006,7 @@
   if (_names.isEmpty) throw 'No names provided';
   String names = itemizeNames(_names);
   return new Message(codeFfiFieldCyclic,
-      message: """${string} '${name}' contains itself. Cycle elements:
+      problemMessage: """${string} '${name}' contains itself. Cycle elements:
 ${names}""", arguments: {'string': string, 'name': name, 'names': _names});
 }
 
@@ -3940,9 +4014,9 @@
 const Template<
     Message Function(String name)> templateFfiFieldInitializer = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Field '#name' is a dart:ffi Pointer to a struct field and therefore cannot be initialized before constructor execution.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Mark the field as external to avoid having to initialize it.""",
     withArguments: _withArgumentsFfiFieldInitializer);
 
@@ -3957,9 +4031,9 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFfiFieldInitializer,
-      message:
+      problemMessage:
           """Field '${name}' is a dart:ffi Pointer to a struct field and therefore cannot be initialized before constructor execution.""",
-      tip: """Mark the field as external to avoid having to initialize it.""",
+      correctionMessage: """Mark the field as external to avoid having to initialize it.""",
       arguments: {'name': name});
 }
 
@@ -3969,7 +4043,7 @@
         String
             name)> templateFfiFieldNoAnnotation = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Field '#name' requires no annotation to declare its native type, it is a Pointer which is represented by the same type in Dart and native code.""",
     withArguments: _withArgumentsFfiFieldNoAnnotation);
 
@@ -3984,7 +4058,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFfiFieldNoAnnotation,
-      message:
+      problemMessage:
           """Field '${name}' requires no annotation to declare its native type, it is a Pointer which is represented by the same type in Dart and native code.""",
       arguments: {'name': name});
 }
@@ -3993,7 +4067,7 @@
 const Template<
     Message Function(String name)> templateFfiFieldNull = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Field '#name' cannot have type 'Null', it must be `int`, `double`, `Pointer`, or a subtype of `Struct` or `Union`.""",
     withArguments: _withArgumentsFfiFieldNull);
 
@@ -4008,7 +4082,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFfiFieldNull,
-      message:
+      problemMessage:
           """Field '${name}' cannot have type 'Null', it must be `int`, `double`, `Pointer`, or a subtype of `Struct` or `Union`.""",
       arguments: {'name': name});
 }
@@ -4020,7 +4094,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFfiLeafCallMustNotReturnHandle = const MessageCode(
     "FfiLeafCallMustNotReturnHandle",
-    message: r"""FFI leaf call must not have Handle return type.""");
+    problemMessage: r"""FFI leaf call must not have Handle return type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeFfiLeafCallMustNotTakeHandle =
@@ -4029,7 +4103,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFfiLeafCallMustNotTakeHandle = const MessageCode(
     "FfiLeafCallMustNotTakeHandle",
-    message: r"""FFI leaf call must not have Handle argument types.""");
+    problemMessage: r"""FFI leaf call must not have Handle argument types.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeFfiNativeAnnotationMustAnnotateStatic =
@@ -4038,14 +4112,14 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFfiNativeAnnotationMustAnnotateStatic =
     const MessageCode("FfiNativeAnnotationMustAnnotateStatic",
-        message:
+        problemMessage:
             r"""FfiNative annotations can only be used on static functions.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(String name)> templateFfiNotStatic = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""#name expects a static function as parameter. dart:ffi only supports calling static Dart functions from native code. Closures and tear-offs are not supported because they can capture context.""",
     withArguments: _withArgumentsFfiNotStatic);
 
@@ -4060,7 +4134,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFfiNotStatic,
-      message:
+      problemMessage:
           """${name} expects a static function as parameter. dart:ffi only supports calling static Dart functions from native code. Closures and tear-offs are not supported because they can capture context.""",
       arguments: {'name': name});
 }
@@ -4068,7 +4142,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateFfiPackedAnnotation =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Struct '#name' must have at most one 'Packed' annotation.""",
         withArguments: _withArgumentsFfiPackedAnnotation);
 
@@ -4083,7 +4157,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFfiPackedAnnotation,
-      message:
+      problemMessage:
           """Struct '${name}' must have at most one 'Packed' annotation.""",
       arguments: {'name': name});
 }
@@ -4095,7 +4169,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFfiPackedAnnotationAlignment = const MessageCode(
     "FfiPackedAnnotationAlignment",
-    message: r"""Only packing to 1, 2, 4, 8, and 16 bytes is supported.""");
+    problemMessage:
+        r"""Only packing to 1, 2, 4, 8, and 16 bytes is supported.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -4104,7 +4179,7 @@
         String
             name2)> templateFfiPackedNestingNonPacked = const Template<
         Message Function(String name, String name2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Nesting the non-packed or less tightly packed struct '#name' in a packed struct '#name2' is not supported.""",
     withArguments: _withArgumentsFfiPackedNestingNonPacked);
 
@@ -4122,7 +4197,7 @@
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   return new Message(codeFfiPackedNestingNonPacked,
-      message:
+      problemMessage:
           """Nesting the non-packed or less tightly packed struct '${name}' in a packed struct '${name2}' is not supported.""",
       arguments: {'name': name, 'name2': name2});
 }
@@ -4130,7 +4205,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateFfiSizeAnnotation =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Field '#name' must have exactly one 'Array' annotation.""",
         withArguments: _withArgumentsFfiSizeAnnotation);
 
@@ -4145,7 +4220,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFfiSizeAnnotation,
-      message: """Field '${name}' must have exactly one 'Array' annotation.""",
+      problemMessage:
+          """Field '${name}' must have exactly one 'Array' annotation.""",
       arguments: {'name': name});
 }
 
@@ -4155,7 +4231,7 @@
         String
             name)> templateFfiSizeAnnotationDimensions = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Field '#name' must have an 'Array' annotation that matches the dimensions.""",
     withArguments: _withArgumentsFfiSizeAnnotationDimensions);
 
@@ -4170,7 +4246,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFfiSizeAnnotationDimensions,
-      message:
+      problemMessage:
           """Field '${name}' must have an 'Array' annotation that matches the dimensions.""",
       arguments: {'name': name});
 }
@@ -4179,7 +4255,7 @@
 const Template<Message Function(String string, String name)>
     templateFfiStructGeneric =
     const Template<Message Function(String string, String name)>(
-        messageTemplate: r"""#string '#name' should not be generic.""",
+        problemMessageTemplate: r"""#string '#name' should not be generic.""",
         withArguments: _withArgumentsFfiStructGeneric);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4194,7 +4270,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFfiStructGeneric,
-      message: """${string} '${name}' should not be generic.""",
+      problemMessage: """${string} '${name}' should not be generic.""",
       arguments: {'string': string, 'name': name});
 }
 
@@ -4204,7 +4280,7 @@
         String
             name)> templateFieldAlreadyInitializedAtDeclaration = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""'#name' is a final instance variable that was initialized at the declaration.""",
     withArguments: _withArgumentsFieldAlreadyInitializedAtDeclaration);
 
@@ -4222,7 +4298,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFieldAlreadyInitializedAtDeclaration,
-      message:
+      problemMessage:
           """'${name}' is a final instance variable that was initialized at the declaration.""",
       arguments: {'name': name});
 }
@@ -4231,7 +4307,7 @@
 const Template<Message Function(String name)>
     templateFieldAlreadyInitializedAtDeclarationCause =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""'#name' was initialized here.""",
+        problemMessageTemplate: r"""'#name' was initialized here.""",
         withArguments: _withArgumentsFieldAlreadyInitializedAtDeclarationCause);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4246,7 +4322,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFieldAlreadyInitializedAtDeclarationCause,
-      message: """'${name}' was initialized here.""",
+      problemMessage: """'${name}' was initialized here.""",
       arguments: {'name': name});
 }
 
@@ -4258,8 +4334,9 @@
 const MessageCode messageFieldInitializedOutsideDeclaringClass = const MessageCode(
     "FieldInitializedOutsideDeclaringClass",
     index: 88,
-    message: r"""A field can only be initialized in its declaring class""",
-    tip:
+    problemMessage:
+        r"""A field can only be initialized in its declaring class""",
+    correctionMessage:
         r"""Try passing a value into the superclass constructor, or moving the initialization into the constructor body.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4270,16 +4347,17 @@
 const MessageCode messageFieldInitializerOutsideConstructor = const MessageCode(
     "FieldInitializerOutsideConstructor",
     index: 79,
-    message: r"""Field formal parameters can only be used in a constructor.""",
-    tip: r"""Try removing 'this.'.""");
+    problemMessage:
+        r"""Field formal parameters can only be used in a constructor.""",
+    correctionMessage: r"""Try removing 'this.'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name, String string)>
     templateFieldNotPromoted =
     const Template<Message Function(String name, String string)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""'#name' refers to a property so it couldn't be promoted.""",
-        tipTemplate: r"""See #string""",
+        correctionMessageTemplate: r"""See #string""",
         withArguments: _withArgumentsFieldNotPromoted);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4294,8 +4372,9 @@
   name = demangleMixinApplicationName(name);
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeFieldNotPromoted,
-      message: """'${name}' refers to a property so it couldn't be promoted.""",
-      tip: """See ${string}""",
+      problemMessage:
+          """'${name}' refers to a property so it couldn't be promoted.""",
+      correctionMessage: """See ${string}""",
       arguments: {'name': name, 'string': string});
 }
 
@@ -4306,9 +4385,10 @@
 const MessageCode messageFinalAndCovariant = const MessageCode(
     "FinalAndCovariant",
     index: 80,
-    message:
+    problemMessage:
         r"""Members can't be declared to be both 'final' and 'covariant'.""",
-    tip: r"""Try removing either the 'final' or 'covariant' keyword.""");
+    correctionMessage:
+        r"""Try removing either the 'final' or 'covariant' keyword.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeFinalAndCovariantLateWithInitializer =
@@ -4318,9 +4398,9 @@
 const MessageCode messageFinalAndCovariantLateWithInitializer = const MessageCode(
     "FinalAndCovariantLateWithInitializer",
     index: 101,
-    message:
+    problemMessage:
         r"""Members marked 'late' with an initializer can't be declared to be both 'final' and 'covariant'.""",
-    tip:
+    correctionMessage:
         r"""Try removing either the 'final' or 'covariant' keyword, or removing the initializer.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4329,8 +4409,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFinalAndVar = const MessageCode("FinalAndVar",
     index: 81,
-    message: r"""Members can't be declared to be both 'final' and 'var'.""",
-    tip: r"""Try removing the keyword 'var'.""");
+    problemMessage:
+        r"""Members can't be declared to be both 'final' and 'var'.""",
+    correctionMessage: r"""Try removing the keyword 'var'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -4338,8 +4419,8 @@
         String
             name)> templateFinalFieldNotInitialized = const Template<
         Message Function(String name)>(
-    messageTemplate: r"""Final field '#name' is not initialized.""",
-    tipTemplate:
+    problemMessageTemplate: r"""Final field '#name' is not initialized.""",
+    correctionMessageTemplate:
         r"""Try to initialize the field in the declaration or in every constructor.""",
     withArguments: _withArgumentsFinalFieldNotInitialized);
 
@@ -4353,8 +4434,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFinalFieldNotInitialized,
-      message: """Final field '${name}' is not initialized.""",
-      tip:
+      problemMessage: """Final field '${name}' is not initialized.""",
+      correctionMessage:
           """Try to initialize the field in the declaration or in every constructor.""",
       arguments: {'name': name});
 }
@@ -4365,9 +4446,9 @@
         String
             name)> templateFinalFieldNotInitializedByConstructor = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Final field '#name' is not initialized by this constructor.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try to initialize the field using an initializing formal or a field initializer.""",
     withArguments: _withArgumentsFinalFieldNotInitializedByConstructor);
 
@@ -4383,9 +4464,9 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFinalFieldNotInitializedByConstructor,
-      message:
+      problemMessage:
           """Final field '${name}' is not initialized by this constructor.""",
-      tip:
+      correctionMessage:
           """Try to initialize the field using an initializing formal or a field initializer.""",
       arguments: {'name': name});
 }
@@ -4396,8 +4477,9 @@
         String
             name)> templateFinalFieldWithoutInitializer = const Template<
         Message Function(String name)>(
-    messageTemplate: r"""The final variable '#name' must be initialized.""",
-    tipTemplate:
+    problemMessageTemplate:
+        r"""The final variable '#name' must be initialized.""",
+    correctionMessageTemplate:
         r"""Try adding an initializer ('= expression') to the declaration.""",
     withArguments: _withArgumentsFinalFieldWithoutInitializer);
 
@@ -4411,8 +4493,9 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFinalFieldWithoutInitializer,
-      message: """The final variable '${name}' must be initialized.""",
-      tip: """Try adding an initializer ('= expression') to the declaration.""",
+      problemMessage: """The final variable '${name}' must be initialized.""",
+      correctionMessage:
+          """Try adding an initializer ('= expression') to the declaration.""",
       arguments: {'name': name});
 }
 
@@ -4422,7 +4505,7 @@
         String
             name)> templateFinalNotAssignedError = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Final variable '#name' must be assigned before it can be used.""",
     withArguments: _withArgumentsFinalNotAssignedError);
 
@@ -4436,7 +4519,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFinalNotAssignedError,
-      message:
+      problemMessage:
           """Final variable '${name}' must be assigned before it can be used.""",
       arguments: {'name': name});
 }
@@ -4447,7 +4530,7 @@
         String
             name)> templateFinalPossiblyAssignedError = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Final variable '#name' might already be assigned at this point.""",
     withArguments: _withArgumentsFinalPossiblyAssignedError);
 
@@ -4461,7 +4544,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFinalPossiblyAssignedError,
-      message:
+      problemMessage:
           """Final variable '${name}' might already be assigned at this point.""",
       arguments: {'name': name});
 }
@@ -4473,7 +4556,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageForInLoopExactlyOneVariable = const MessageCode(
     "ForInLoopExactlyOneVariable",
-    message: r"""A for-in loop can't have more than one loop variable.""");
+    problemMessage:
+        r"""A for-in loop can't have more than one loop variable.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeForInLoopNotAssignable = messageForInLoopNotAssignable;
@@ -4481,7 +4565,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageForInLoopNotAssignable = const MessageCode(
     "ForInLoopNotAssignable",
-    message:
+    problemMessage:
         r"""Can't assign to this, so it can't be used in a for-in loop.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4492,8 +4576,8 @@
 const MessageCode messageForInLoopWithConstVariable = const MessageCode(
     "ForInLoopWithConstVariable",
     analyzerCodes: <String>["FOR_IN_WITH_CONST_VARIABLE"],
-    message: r"""A for-in loop-variable can't be 'const'.""",
-    tip: r"""Try removing the 'const' modifier.""");
+    problemMessage: r"""A for-in loop-variable can't be 'const'.""",
+    correctionMessage: r"""Try removing the 'const' modifier.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeFunctionAsTypeParameter = messageFunctionAsTypeParameter;
@@ -4501,7 +4585,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFunctionAsTypeParameter = const MessageCode(
     "FunctionAsTypeParameter",
-    message:
+    problemMessage:
         r"""'Function' is a built-in identifier, could not used as a type identifier.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4511,7 +4595,7 @@
 const MessageCode messageFunctionTypeDefaultValue = const MessageCode(
     "FunctionTypeDefaultValue",
     analyzerCodes: <String>["DEFAULT_VALUE_IN_FUNCTION_TYPE"],
-    message: r"""Can't have a default value in a function type.""");
+    problemMessage: r"""Can't have a default value in a function type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeFunctionTypedParameterVar =
@@ -4521,15 +4605,15 @@
 const MessageCode messageFunctionTypedParameterVar = const MessageCode(
     "FunctionTypedParameterVar",
     analyzerCodes: <String>["FUNCTION_TYPED_PARAMETER_VAR"],
-    message:
+    problemMessage:
         r"""Function-typed parameters can't specify 'const', 'final' or 'var' in place of a return type.""",
-    tip: r"""Try replacing the keyword with a return type.""");
+    correctionMessage: r"""Try replacing the keyword with a return type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(String name)> templateFunctionUsedAsDec = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""'Function' is a built-in identifier, could not used as a #name name.""",
     withArguments: _withArgumentsFunctionUsedAsDec);
 
@@ -4544,7 +4628,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeFunctionUsedAsDec,
-      message:
+      problemMessage:
           """'Function' is a built-in identifier, could not used as a ${name} name.""",
       arguments: {'name': name});
 }
@@ -4556,7 +4640,7 @@
 const MessageCode messageGeneratorReturnsValue = const MessageCode(
     "GeneratorReturnsValue",
     analyzerCodes: <String>["RETURN_IN_GENERATOR"],
-    message: r"""'sync*' and 'async*' can't return a value.""");
+    problemMessage: r"""'sync*' and 'async*' can't return a value.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeGenericFunctionTypeInBound =
@@ -4566,7 +4650,7 @@
 const MessageCode messageGenericFunctionTypeInBound = const MessageCode(
     "GenericFunctionTypeInBound",
     analyzerCodes: <String>["GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND"],
-    message:
+    problemMessage:
         r"""Type variables can't have generic function types in their bounds.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4577,9 +4661,9 @@
 const MessageCode messageGenericFunctionTypeUsedAsActualTypeArgument =
     const MessageCode("GenericFunctionTypeUsedAsActualTypeArgument",
         analyzerCodes: <String>["GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT"],
-        message:
+        problemMessage:
             r"""A generic function type can't be used as a type argument.""",
-        tip: r"""Try using a non-generic function type.""");
+        correctionMessage: r"""Try using a non-generic function type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeGetterConstructor = messageGetterConstructor;
@@ -4588,13 +4672,13 @@
 const MessageCode messageGetterConstructor = const MessageCode(
     "GetterConstructor",
     index: 103,
-    message: r"""Constructors can't be a getter.""",
-    tip: r"""Try removing 'get'.""");
+    problemMessage: r"""Constructors can't be a getter.""",
+    correctionMessage: r"""Try removing 'get'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateGetterNotFound =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Getter not found: '#name'.""",
+        problemMessageTemplate: r"""Getter not found: '#name'.""",
         withArguments: _withArgumentsGetterNotFound);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4607,7 +4691,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeGetterNotFound,
-      message: """Getter not found: '${name}'.""", arguments: {'name': name});
+      problemMessage: """Getter not found: '${name}'.""",
+      arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4617,8 +4702,8 @@
 const MessageCode messageGetterWithFormals = const MessageCode(
     "GetterWithFormals",
     analyzerCodes: <String>["GETTER_WITH_PARAMETERS"],
-    message: r"""A getter can't have formal parameters.""",
-    tip: r"""Try removing '(...)'.""");
+    problemMessage: r"""A getter can't have formal parameters.""",
+    correctionMessage: r"""Try removing '(...)'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeIllegalAssignmentToNonAssignable =
@@ -4628,7 +4713,7 @@
 const MessageCode messageIllegalAssignmentToNonAssignable = const MessageCode(
     "IllegalAssignmentToNonAssignable",
     index: 45,
-    message: r"""Illegal assignment to non-assignable expression.""");
+    problemMessage: r"""Illegal assignment to non-assignable expression.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeIllegalAsyncGeneratorReturnType =
@@ -4638,7 +4723,7 @@
 const MessageCode messageIllegalAsyncGeneratorReturnType = const MessageCode(
     "IllegalAsyncGeneratorReturnType",
     analyzerCodes: <String>["ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE"],
-    message:
+    problemMessage:
         r"""Functions marked 'async*' must have a return type assignable to 'Stream'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4648,7 +4733,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageIllegalAsyncGeneratorVoidReturnType =
     const MessageCode("IllegalAsyncGeneratorVoidReturnType",
-        message:
+        problemMessage:
             r"""Functions marked 'async*' can't have return type 'void'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4658,13 +4743,13 @@
 const MessageCode messageIllegalAsyncReturnType = const MessageCode(
     "IllegalAsyncReturnType",
     analyzerCodes: <String>["ILLEGAL_ASYNC_RETURN_TYPE"],
-    message:
+    problemMessage:
         r"""Functions marked 'async' must have a return type assignable to 'Future'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateIllegalMixin =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""The type '#name' can't be mixed in.""",
+        problemMessageTemplate: r"""The type '#name' can't be mixed in.""",
         withArguments: _withArgumentsIllegalMixin);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4677,7 +4762,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeIllegalMixin,
-      message: """The type '${name}' can't be mixed in.""",
+      problemMessage: """The type '${name}' can't be mixed in.""",
       arguments: {'name': name});
 }
 
@@ -4685,7 +4770,7 @@
 const Template<Message Function(String name)>
     templateIllegalMixinDueToConstructors =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't use '#name' as a mixin because it has constructors.""",
         withArguments: _withArgumentsIllegalMixinDueToConstructors);
 
@@ -4699,7 +4784,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeIllegalMixinDueToConstructors,
-      message:
+      problemMessage:
           """Can't use '${name}' as a mixin because it has constructors.""",
       arguments: {'name': name});
 }
@@ -4708,7 +4793,7 @@
 const Template<Message Function(String name)>
     templateIllegalMixinDueToConstructorsCause =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""This constructor prevents using '#name' as a mixin.""",
         withArguments: _withArgumentsIllegalMixinDueToConstructorsCause);
 
@@ -4724,7 +4809,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeIllegalMixinDueToConstructorsCause,
-      message: """This constructor prevents using '${name}' as a mixin.""",
+      problemMessage:
+          """This constructor prevents using '${name}' as a mixin.""",
       arguments: {'name': name});
 }
 
@@ -4736,7 +4822,7 @@
 const MessageCode messageIllegalSyncGeneratorReturnType = const MessageCode(
     "IllegalSyncGeneratorReturnType",
     analyzerCodes: <String>["ILLEGAL_SYNC_GENERATOR_RETURN_TYPE"],
-    message:
+    problemMessage:
         r"""Functions marked 'sync*' must have a return type assignable to 'Iterable'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4746,7 +4832,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageIllegalSyncGeneratorVoidReturnType = const MessageCode(
     "IllegalSyncGeneratorVoidReturnType",
-    message: r"""Functions marked 'sync*' can't have return type 'void'.""");
+    problemMessage:
+        r"""Functions marked 'sync*' can't have return type 'void'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeImplementFunction = messageImplementFunction;
@@ -4755,8 +4842,9 @@
 const MessageCode messageImplementFunction = const MessageCode(
     "ImplementFunction",
     severity: Severity.ignored,
-    message: r"""Implementing 'Function' is deprecated.""",
-    tip: r"""Try removing 'Function' from the 'implements' clause.""");
+    problemMessage: r"""Implementing 'Function' is deprecated.""",
+    correctionMessage:
+        r"""Try removing 'Function' from the 'implements' clause.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeImplementsBeforeExtends = messageImplementsBeforeExtends;
@@ -4765,8 +4853,10 @@
 const MessageCode messageImplementsBeforeExtends = const MessageCode(
     "ImplementsBeforeExtends",
     index: 44,
-    message: r"""The extends clause must be before the implements clause.""",
-    tip: r"""Try moving the extends clause before the implements clause.""");
+    problemMessage:
+        r"""The extends clause must be before the implements clause.""",
+    correctionMessage:
+        r"""Try moving the extends clause before the implements clause.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeImplementsBeforeOn = messageImplementsBeforeOn;
@@ -4775,8 +4865,9 @@
 const MessageCode messageImplementsBeforeOn = const MessageCode(
     "ImplementsBeforeOn",
     index: 43,
-    message: r"""The on clause must be before the implements clause.""",
-    tip: r"""Try moving the on clause before the implements clause.""");
+    problemMessage: r"""The on clause must be before the implements clause.""",
+    correctionMessage:
+        r"""Try moving the on clause before the implements clause.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeImplementsBeforeWith = messageImplementsBeforeWith;
@@ -4785,8 +4876,10 @@
 const MessageCode messageImplementsBeforeWith = const MessageCode(
     "ImplementsBeforeWith",
     index: 42,
-    message: r"""The with clause must be before the implements clause.""",
-    tip: r"""Try moving the with clause before the implements clause.""");
+    problemMessage:
+        r"""The with clause must be before the implements clause.""",
+    correctionMessage:
+        r"""Try moving the with clause before the implements clause.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeImplementsFutureOr = messageImplementsFutureOr;
@@ -4794,7 +4887,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageImplementsFutureOr = const MessageCode(
     "ImplementsFutureOr",
-    message:
+    problemMessage:
         r"""The type 'FutureOr' can't be used in an 'implements' clause.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4802,14 +4895,16 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageImplementsNever = const MessageCode("ImplementsNever",
-    message: r"""The type 'Never' can't be used in an 'implements' clause.""");
+    problemMessage:
+        r"""The type 'Never' can't be used in an 'implements' clause.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name, int count)>
     templateImplementsRepeated =
     const Template<Message Function(String name, int count)>(
-        messageTemplate: r"""'#name' can only be implemented once.""",
-        tipTemplate: r"""Try removing #count of the occurrences.""",
+        problemMessageTemplate: r"""'#name' can only be implemented once.""",
+        correctionMessageTemplate:
+            r"""Try removing #count of the occurrences.""",
         withArguments: _withArgumentsImplementsRepeated);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4824,8 +4919,8 @@
   // ignore: unnecessary_null_comparison
   if (count == null) throw 'No count provided';
   return new Message(codeImplementsRepeated,
-      message: """'${name}' can only be implemented once.""",
-      tip: """Try removing ${count} of the occurrences.""",
+      problemMessage: """'${name}' can only be implemented once.""",
+      correctionMessage: """Try removing ${count} of the occurrences.""",
       arguments: {'name': name, 'count': count});
 }
 
@@ -4835,9 +4930,9 @@
         String
             name)> templateImplementsSuperClass = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""'#name' can't be used in both 'extends' and 'implements' clauses.""",
-    tipTemplate: r"""Try removing one of the occurrences.""",
+    correctionMessageTemplate: r"""Try removing one of the occurrences.""",
     withArguments: _withArgumentsImplementsSuperClass);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4850,9 +4945,9 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeImplementsSuperClass,
-      message:
+      problemMessage:
           """'${name}' can't be used in both 'extends' and 'implements' clauses.""",
-      tip: """Try removing one of the occurrences.""",
+      correctionMessage: """Try removing one of the occurrences.""",
       arguments: {'name': name});
 }
 
@@ -4861,7 +4956,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageImplementsVoid = const MessageCode("ImplementsVoid",
-    message: r"""The type 'void' can't be used in an 'implements' clause.""");
+    problemMessage:
+        r"""The type 'void' can't be used in an 'implements' clause.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -4871,7 +4967,7 @@
         String
             name3)> templateImplicitMixinOverride = const Template<
         Message Function(String name, String name2, String name3)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Applying the mixin '#name' to '#name2' introduces an erroneous override of '#name3'.""",
     withArguments: _withArgumentsImplicitMixinOverride);
 
@@ -4892,7 +4988,7 @@
   if (name3.isEmpty) throw 'No name provided';
   name3 = demangleMixinApplicationName(name3);
   return new Message(codeImplicitMixinOverride,
-      message:
+      problemMessage:
           """Applying the mixin '${name}' to '${name2}' introduces an erroneous override of '${name3}'.""",
       arguments: {'name': name, 'name2': name2, 'name3': name3});
 }
@@ -4903,8 +4999,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageImportAfterPart = const MessageCode("ImportAfterPart",
     index: 10,
-    message: r"""Import directives must precede part directives.""",
-    tip: r"""Try moving the import directives before the part directives.""");
+    problemMessage: r"""Import directives must precede part directives.""",
+    correctionMessage:
+        r"""Try moving the import directives before the part directives.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeIncorrectTypeArgumentVariable =
@@ -4914,7 +5011,8 @@
 const MessageCode messageIncorrectTypeArgumentVariable = const MessageCode(
     "IncorrectTypeArgumentVariable",
     severity: Severity.context,
-    message: r"""This is the type variable whose bound isn't conformed to.""");
+    problemMessage:
+        r"""This is the type variable whose bound isn't conformed to.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -4922,7 +5020,7 @@
         String
             string)> templateIncrementalCompilerIllegalParameter = const Template<
         Message Function(String string)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Illegal parameter name '#string' found during expression compilation.""",
     withArguments: _withArgumentsIncrementalCompilerIllegalParameter);
 
@@ -4937,7 +5035,7 @@
 Message _withArgumentsIncrementalCompilerIllegalParameter(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeIncrementalCompilerIllegalParameter,
-      message:
+      problemMessage:
           """Illegal parameter name '${string}' found during expression compilation.""",
       arguments: {'string': string});
 }
@@ -4946,7 +5044,7 @@
 const Template<Message Function(String string)>
     templateIncrementalCompilerIllegalTypeParameter =
     const Template<Message Function(String string)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Illegal type parameter name '#string' found during expression compilation.""",
         withArguments: _withArgumentsIncrementalCompilerIllegalTypeParameter);
 
@@ -4961,7 +5059,7 @@
 Message _withArgumentsIncrementalCompilerIllegalTypeParameter(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeIncrementalCompilerIllegalTypeParameter,
-      message:
+      problemMessage:
           """Illegal type parameter name '${string}' found during expression compilation.""",
       arguments: {'string': string});
 }
@@ -4969,7 +5067,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Uri uri_)> templateInferredPackageUri =
     const Template<Message Function(Uri uri_)>(
-        messageTemplate: r"""Interpreting this as package URI, '#uri'.""",
+        problemMessageTemplate:
+            r"""Interpreting this as package URI, '#uri'.""",
         withArguments: _withArgumentsInferredPackageUri);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4981,7 +5080,7 @@
 Message _withArgumentsInferredPackageUri(Uri uri_) {
   String? uri = relativizeUri(uri_);
   return new Message(codeInferredPackageUri,
-      message: """Interpreting this as package URI, '${uri}'.""",
+      problemMessage: """Interpreting this as package URI, '${uri}'.""",
       arguments: {'uri': uri_});
 }
 
@@ -4992,7 +5091,8 @@
 const MessageCode messageInheritedMembersConflict = const MessageCode(
     "InheritedMembersConflict",
     analyzerCodes: <String>["CONFLICTS_WITH_INHERITED_MEMBER"],
-    message: r"""Can't inherit members that conflict with each other.""");
+    problemMessage:
+        r"""Can't inherit members that conflict with each other.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInheritedMembersConflictCause1 =
@@ -5002,7 +5102,7 @@
 const MessageCode messageInheritedMembersConflictCause1 = const MessageCode(
     "InheritedMembersConflictCause1",
     severity: Severity.context,
-    message: r"""This is one inherited member.""");
+    problemMessage: r"""This is one inherited member.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInheritedMembersConflictCause2 =
@@ -5012,7 +5112,7 @@
 const MessageCode messageInheritedMembersConflictCause2 = const MessageCode(
     "InheritedMembersConflictCause2",
     severity: Severity.context,
-    message: r"""This is the other inherited member.""");
+    problemMessage: r"""This is the other inherited member.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -5021,7 +5121,7 @@
         Uri
             uri_)> templateInitializeFromDillNotSelfContained = const Template<
         Message Function(String string, Uri uri_)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Tried to initialize from a previous compilation (#string), but the file was not self-contained. This might be a bug.
 
 The Dart team would greatly appreciate it if you would take a moment to report this problem at http://dartbug.com/new.
@@ -5042,7 +5142,7 @@
   if (string.isEmpty) throw 'No string provided';
   String? uri = relativizeUri(uri_);
   return new Message(codeInitializeFromDillNotSelfContained,
-      message:
+      problemMessage:
           """Tried to initialize from a previous compilation (${string}), but the file was not self-contained. This might be a bug.
 
 The Dart team would greatly appreciate it if you would take a moment to report this problem at http://dartbug.com/new.
@@ -5055,7 +5155,7 @@
 const Template<Message Function(String string)>
     templateInitializeFromDillNotSelfContainedNoDump =
     const Template<Message Function(String string)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Tried to initialize from a previous compilation (#string), but the file was not self-contained. This might be a bug.
 
 The Dart team would greatly appreciate it if you would take a moment to report this problem at http://dartbug.com/new.""",
@@ -5072,7 +5172,7 @@
 Message _withArgumentsInitializeFromDillNotSelfContainedNoDump(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeInitializeFromDillNotSelfContainedNoDump,
-      message:
+      problemMessage:
           """Tried to initialize from a previous compilation (${string}), but the file was not self-contained. This might be a bug.
 
 The Dart team would greatly appreciate it if you would take a moment to report this problem at http://dartbug.com/new.""",
@@ -5089,7 +5189,7 @@
             uri_)> templateInitializeFromDillUnknownProblem = const Template<
         Message Function(
             String string, String string2, String string3, Uri uri_)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Tried to initialize from a previous compilation (#string), but couldn't.
 Error message was '#string2'.
 Stacktrace included '#string3'.
@@ -5118,7 +5218,7 @@
   if (string3.isEmpty) throw 'No string provided';
   String? uri = relativizeUri(uri_);
   return new Message(codeInitializeFromDillUnknownProblem,
-      message:
+      problemMessage:
           """Tried to initialize from a previous compilation (${string}), but couldn't.
 Error message was '${string2}'.
 Stacktrace included '${string3}'.
@@ -5139,7 +5239,7 @@
 const Template<Message Function(String string, String string2, String string3)>
     templateInitializeFromDillUnknownProblemNoDump = const Template<
             Message Function(String string, String string2, String string3)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Tried to initialize from a previous compilation (#string), but couldn't.
 Error message was '#string2'.
 Stacktrace included '#string3'.
@@ -5162,7 +5262,7 @@
   if (string2.isEmpty) throw 'No string provided';
   if (string3.isEmpty) throw 'No string provided';
   return new Message(codeInitializeFromDillUnknownProblemNoDump,
-      message:
+      problemMessage:
           """Tried to initialize from a previous compilation (${string}), but couldn't.
 Error message was '${string2}'.
 Stacktrace included '${string3}'.
@@ -5180,15 +5280,17 @@
 const MessageCode messageInitializedVariableInForEach = const MessageCode(
     "InitializedVariableInForEach",
     index: 82,
-    message: r"""The loop variable in a for-each loop can't be initialized.""",
-    tip:
+    problemMessage:
+        r"""The loop variable in a for-each loop can't be initialized.""",
+    correctionMessage:
         r"""Try removing the initializer, or using a different kind of loop.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateInitializerForStaticField =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""'#name' isn't an instance field of this class.""",
+        problemMessageTemplate:
+            r"""'#name' isn't an instance field of this class.""",
         withArguments: _withArgumentsInitializerForStaticField);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5201,7 +5303,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeInitializerForStaticField,
-      message: """'${name}' isn't an instance field of this class.""",
+      problemMessage: """'${name}' isn't an instance field of this class.""",
       arguments: {'name': name});
 }
 
@@ -5213,12 +5315,12 @@
 const MessageCode messageInitializingFormalTypeMismatchField =
     const MessageCode("InitializingFormalTypeMismatchField",
         severity: Severity.context,
-        message: r"""The field that corresponds to the parameter.""");
+        problemMessage: r"""The field that corresponds to the parameter.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Uri uri_)> templateInputFileNotFound =
     const Template<Message Function(Uri uri_)>(
-        messageTemplate: r"""Input file not found: #uri.""",
+        problemMessageTemplate: r"""Input file not found: #uri.""",
         withArguments: _withArgumentsInputFileNotFound);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5231,16 +5333,18 @@
 Message _withArgumentsInputFileNotFound(Uri uri_) {
   String? uri = relativizeUri(uri_);
   return new Message(codeInputFileNotFound,
-      message: """Input file not found: ${uri}.""", arguments: {'uri': uri_});
+      problemMessage: """Input file not found: ${uri}.""",
+      arguments: {'uri': uri_});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(int count, int count2)>
     templateInstantiationTooFewArguments =
     const Template<Message Function(int count, int count2)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Too few type arguments: #count required, #count2 given.""",
-        tipTemplate: r"""Try adding the missing type arguments.""",
+        correctionMessageTemplate:
+            r"""Try adding the missing type arguments.""",
         withArguments: _withArgumentsInstantiationTooFewArguments);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5257,9 +5361,9 @@
   // ignore: unnecessary_null_comparison
   if (count2 == null) throw 'No count provided';
   return new Message(codeInstantiationTooFewArguments,
-      message:
+      problemMessage:
           """Too few type arguments: ${count} required, ${count2} given.""",
-      tip: """Try adding the missing type arguments.""",
+      correctionMessage: """Try adding the missing type arguments.""",
       arguments: {'count': count, 'count2': count2});
 }
 
@@ -5267,9 +5371,10 @@
 const Template<Message Function(int count, int count2)>
     templateInstantiationTooManyArguments =
     const Template<Message Function(int count, int count2)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Too many type arguments: #count allowed, but #count2 found.""",
-        tipTemplate: r"""Try removing the extra type arguments.""",
+        correctionMessageTemplate:
+            r"""Try removing the extra type arguments.""",
         withArguments: _withArgumentsInstantiationTooManyArguments);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5286,9 +5391,9 @@
   // ignore: unnecessary_null_comparison
   if (count2 == null) throw 'No count provided';
   return new Message(codeInstantiationTooManyArguments,
-      message:
+      problemMessage:
           """Too many type arguments: ${count} allowed, but ${count2} found.""",
-      tip: """Try removing the extra type arguments.""",
+      correctionMessage: """Try removing the extra type arguments.""",
       arguments: {'count': count, 'count2': count2});
 }
 
@@ -5298,9 +5403,9 @@
         String
             string)> templateIntegerLiteralIsOutOfRange = const Template<
         Message Function(String string)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The integer literal #string can't be represented in 64 bits.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try using the BigInt class if you need an integer larger than 9,223,372,036,854,775,807 or less than -9,223,372,036,854,775,808.""",
     withArguments: _withArgumentsIntegerLiteralIsOutOfRange);
 
@@ -5313,9 +5418,9 @@
 Message _withArgumentsIntegerLiteralIsOutOfRange(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeIntegerLiteralIsOutOfRange,
-      message:
+      problemMessage:
           """The integer literal ${string} can't be represented in 64 bits.""",
-      tip:
+      correctionMessage:
           """Try using the BigInt class if you need an integer larger than 9,223,372,036,854,775,807 or less than -9,223,372,036,854,775,808.""",
       arguments: {'string': string});
 }
@@ -5327,7 +5432,7 @@
         String
             name2)> templateInterfaceCheck = const Template<
         Message Function(String name, String name2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The implementation of '#name' in the non-abstract class '#name2' does not conform to its interface.""",
     withArguments: _withArgumentsInterfaceCheck);
 
@@ -5344,7 +5449,7 @@
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   return new Message(codeInterfaceCheck,
-      message:
+      problemMessage:
           """The implementation of '${name}' in the non-abstract class '${name2}' does not conform to its interface.""",
       arguments: {'name': name, 'name2': name2});
 }
@@ -5357,7 +5462,8 @@
 const MessageCode messageInternalProblemAlreadyInitialized = const MessageCode(
     "InternalProblemAlreadyInitialized",
     severity: Severity.internalProblem,
-    message: r"""Attempt to set initializer on field without initializer.""");
+    problemMessage:
+        r"""Attempt to set initializer on field without initializer.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInternalProblemBodyOnAbstractMethod =
@@ -5367,13 +5473,13 @@
 const MessageCode messageInternalProblemBodyOnAbstractMethod =
     const MessageCode("InternalProblemBodyOnAbstractMethod",
         severity: Severity.internalProblem,
-        message: r"""Attempting to set body on abstract method.""");
+        problemMessage: r"""Attempting to set body on abstract method.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name, Uri uri_)>
     templateInternalProblemConstructorNotFound =
     const Template<Message Function(String name, Uri uri_)>(
-        messageTemplate: r"""No constructor named '#name' in '#uri'.""",
+        problemMessageTemplate: r"""No constructor named '#name' in '#uri'.""",
         withArguments: _withArgumentsInternalProblemConstructorNotFound);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5390,7 +5496,7 @@
   name = demangleMixinApplicationName(name);
   String? uri = relativizeUri(uri_);
   return new Message(codeInternalProblemConstructorNotFound,
-      message: """No constructor named '${name}' in '${uri}'.""",
+      problemMessage: """No constructor named '${name}' in '${uri}'.""",
       arguments: {'name': name, 'uri': uri_});
 }
 
@@ -5398,7 +5504,7 @@
 const Template<Message Function(String string)>
     templateInternalProblemContextSeverity =
     const Template<Message Function(String string)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Non-context message has context severity: #string""",
         withArguments: _withArgumentsInternalProblemContextSeverity);
 
@@ -5412,7 +5518,7 @@
 Message _withArgumentsInternalProblemContextSeverity(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeInternalProblemContextSeverity,
-      message: """Non-context message has context severity: ${string}""",
+      problemMessage: """Non-context message has context severity: ${string}""",
       arguments: {'string': string});
 }
 
@@ -5420,7 +5526,7 @@
 const Template<Message Function(String name, String string)>
     templateInternalProblemDebugAbort =
     const Template<Message Function(String name, String string)>(
-        messageTemplate: r"""Compilation aborted due to fatal '#name' at:
+        problemMessageTemplate: r"""Compilation aborted due to fatal '#name' at:
 #string""", withArguments: _withArgumentsInternalProblemDebugAbort);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5436,7 +5542,7 @@
   name = demangleMixinApplicationName(name);
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeInternalProblemDebugAbort,
-      message: """Compilation aborted due to fatal '${name}' at:
+      problemMessage: """Compilation aborted due to fatal '${name}' at:
 ${string}""", arguments: {'name': name, 'string': string});
 }
 
@@ -5448,7 +5554,7 @@
 const MessageCode messageInternalProblemExtendingUnmodifiableScope =
     const MessageCode("InternalProblemExtendingUnmodifiableScope",
         severity: Severity.internalProblem,
-        message: r"""Can't extend an unmodifiable scope.""");
+        problemMessage: r"""Can't extend an unmodifiable scope.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInternalProblemLabelUsageInVariablesDeclaration =
@@ -5458,7 +5564,7 @@
 const MessageCode messageInternalProblemLabelUsageInVariablesDeclaration =
     const MessageCode("InternalProblemLabelUsageInVariablesDeclaration",
         severity: Severity.internalProblem,
-        message:
+        problemMessage:
             r"""Unexpected usage of label inside declaration of variables.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5469,14 +5575,14 @@
 const MessageCode messageInternalProblemMissingContext = const MessageCode(
     "InternalProblemMissingContext",
     severity: Severity.internalProblem,
-    message: r"""Compiler cannot run without a compiler context.""",
-    tip:
+    problemMessage: r"""Compiler cannot run without a compiler context.""",
+    correctionMessage:
         r"""Are calls to the compiler wrapped in CompilerContext.runInContext?""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateInternalProblemNotFound =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Couldn't find '#name'.""",
+        problemMessageTemplate: r"""Couldn't find '#name'.""",
         withArguments: _withArgumentsInternalProblemNotFound);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5489,14 +5595,15 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeInternalProblemNotFound,
-      message: """Couldn't find '${name}'.""", arguments: {'name': name});
+      problemMessage: """Couldn't find '${name}'.""",
+      arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name, String name2)>
     templateInternalProblemNotFoundIn =
     const Template<Message Function(String name, String name2)>(
-        messageTemplate: r"""Couldn't find '#name' in '#name2'.""",
+        problemMessageTemplate: r"""Couldn't find '#name' in '#name2'.""",
         withArguments: _withArgumentsInternalProblemNotFoundIn);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5513,7 +5620,7 @@
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   return new Message(codeInternalProblemNotFoundIn,
-      message: """Couldn't find '${name}' in '${name2}'.""",
+      problemMessage: """Couldn't find '${name}' in '${name2}'.""",
       arguments: {'name': name, 'name2': name2});
 }
 
@@ -5525,13 +5632,14 @@
 const MessageCode messageInternalProblemPreviousTokenNotFound =
     const MessageCode("InternalProblemPreviousTokenNotFound",
         severity: Severity.internalProblem,
-        message: r"""Couldn't find previous token.""");
+        problemMessage: r"""Couldn't find previous token.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateInternalProblemPrivateConstructorAccess =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Can't access private constructor '#name'.""",
+        problemMessageTemplate:
+            r"""Can't access private constructor '#name'.""",
         withArguments: _withArgumentsInternalProblemPrivateConstructorAccess);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5546,7 +5654,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeInternalProblemPrivateConstructorAccess,
-      message: """Can't access private constructor '${name}'.""",
+      problemMessage: """Can't access private constructor '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -5558,14 +5666,14 @@
 const MessageCode messageInternalProblemProvidedBothCompileSdkAndSdkSummary =
     const MessageCode("InternalProblemProvidedBothCompileSdkAndSdkSummary",
         severity: Severity.internalProblem,
-        message:
+        problemMessage:
             r"""The compileSdk and sdkSummary options are mutually exclusive""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name, String string)>
     templateInternalProblemStackNotEmpty =
     const Template<Message Function(String name, String string)>(
-        messageTemplate: r"""#name.stack isn't empty:
+        problemMessageTemplate: r"""#name.stack isn't empty:
   #string""", withArguments: _withArgumentsInternalProblemStackNotEmpty);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5581,7 +5689,7 @@
   name = demangleMixinApplicationName(name);
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeInternalProblemStackNotEmpty,
-      message: """${name}.stack isn't empty:
+      problemMessage: """${name}.stack isn't empty:
   ${string}""", arguments: {'name': name, 'string': string});
 }
 
@@ -5589,7 +5697,7 @@
 const Template<Message Function(String string, String string2)>
     templateInternalProblemUnexpected =
     const Template<Message Function(String string, String string2)>(
-        messageTemplate: r"""Expected '#string', but got '#string2'.""",
+        problemMessageTemplate: r"""Expected '#string', but got '#string2'.""",
         withArguments: _withArgumentsInternalProblemUnexpected);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5604,7 +5712,7 @@
   if (string.isEmpty) throw 'No string provided';
   if (string2.isEmpty) throw 'No string provided';
   return new Message(codeInternalProblemUnexpected,
-      message: """Expected '${string}', but got '${string2}'.""",
+      problemMessage: """Expected '${string}', but got '${string2}'.""",
       arguments: {'string': string, 'string2': string2});
 }
 
@@ -5615,7 +5723,7 @@
         Uri
             uri_)> templateInternalProblemUnfinishedTypeVariable = const Template<
         Message Function(String name, Uri uri_)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Unfinished type variable '#name' found in non-source library '#uri'.""",
     withArguments: _withArgumentsInternalProblemUnfinishedTypeVariable);
 
@@ -5633,7 +5741,7 @@
   name = demangleMixinApplicationName(name);
   String? uri = relativizeUri(uri_);
   return new Message(codeInternalProblemUnfinishedTypeVariable,
-      message:
+      problemMessage:
           """Unfinished type variable '${name}' found in non-source library '${uri}'.""",
       arguments: {'name': name, 'uri': uri_});
 }
@@ -5642,7 +5750,7 @@
 const Template<Message Function(String string, String string2)>
     templateInternalProblemUnhandled =
     const Template<Message Function(String string, String string2)>(
-        messageTemplate: r"""Unhandled #string in #string2.""",
+        problemMessageTemplate: r"""Unhandled #string in #string2.""",
         withArguments: _withArgumentsInternalProblemUnhandled);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5657,7 +5765,7 @@
   if (string.isEmpty) throw 'No string provided';
   if (string2.isEmpty) throw 'No string provided';
   return new Message(codeInternalProblemUnhandled,
-      message: """Unhandled ${string} in ${string2}.""",
+      problemMessage: """Unhandled ${string} in ${string2}.""",
       arguments: {'string': string, 'string2': string2});
 }
 
@@ -5665,7 +5773,7 @@
 const Template<Message Function(String string)>
     templateInternalProblemUnimplemented =
     const Template<Message Function(String string)>(
-        messageTemplate: r"""Unimplemented #string.""",
+        problemMessageTemplate: r"""Unimplemented #string.""",
         withArguments: _withArgumentsInternalProblemUnimplemented);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5677,14 +5785,15 @@
 Message _withArgumentsInternalProblemUnimplemented(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeInternalProblemUnimplemented,
-      message: """Unimplemented ${string}.""", arguments: {'string': string});
+      problemMessage: """Unimplemented ${string}.""",
+      arguments: {'string': string});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateInternalProblemUnsupported =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Unsupported operation: '#name'.""",
+        problemMessageTemplate: r"""Unsupported operation: '#name'.""",
         withArguments: _withArgumentsInternalProblemUnsupported);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5697,7 +5806,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeInternalProblemUnsupported,
-      message: """Unsupported operation: '${name}'.""",
+      problemMessage: """Unsupported operation: '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -5705,7 +5814,7 @@
 const Template<Message Function(Uri uri_)>
     templateInternalProblemUriMissingScheme =
     const Template<Message Function(Uri uri_)>(
-        messageTemplate: r"""The URI '#uri' has no scheme.""",
+        problemMessageTemplate: r"""The URI '#uri' has no scheme.""",
         withArguments: _withArgumentsInternalProblemUriMissingScheme);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5717,15 +5826,18 @@
 Message _withArgumentsInternalProblemUriMissingScheme(Uri uri_) {
   String? uri = relativizeUri(uri_);
   return new Message(codeInternalProblemUriMissingScheme,
-      message: """The URI '${uri}' has no scheme.""", arguments: {'uri': uri_});
+      problemMessage: """The URI '${uri}' has no scheme.""",
+      arguments: {'uri': uri_});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string)>
     templateInternalProblemVerificationError =
     const Template<Message Function(String string)>(
-        messageTemplate: r"""Verification of the generated program failed:
-#string""", withArguments: _withArgumentsInternalProblemVerificationError);
+        problemMessageTemplate:
+            r"""Verification of the generated program failed:
+#string""",
+        withArguments: _withArgumentsInternalProblemVerificationError);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Message Function(String string)>
@@ -5738,7 +5850,7 @@
 Message _withArgumentsInternalProblemVerificationError(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeInternalProblemVerificationError,
-      message: """Verification of the generated program failed:
+      problemMessage: """Verification of the generated program failed:
 ${string}""", arguments: {'string': string});
 }
 
@@ -5749,7 +5861,7 @@
 const MessageCode messageInterpolationInUri = const MessageCode(
     "InterpolationInUri",
     analyzerCodes: <String>["INVALID_LITERAL_IN_CONFIGURATION"],
-    message: r"""Can't use string interpolation in a URI.""");
+    problemMessage: r"""Can't use string interpolation in a URI.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInvalidAwaitFor = messageInvalidAwaitFor;
@@ -5757,14 +5869,15 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInvalidAwaitFor = const MessageCode("InvalidAwaitFor",
     index: 9,
-    message:
+    problemMessage:
         r"""The keyword 'await' isn't allowed for a normal 'for' statement.""",
-    tip: r"""Try removing the keyword, or use a for-each statement.""");
+    correctionMessage:
+        r"""Try removing the keyword, or use a for-each statement.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateInvalidBreakTarget =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Can't break to '#name'.""",
+        problemMessageTemplate: r"""Can't break to '#name'.""",
         withArguments: _withArgumentsInvalidBreakTarget);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5778,7 +5891,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeInvalidBreakTarget,
-      message: """Can't break to '${name}'.""", arguments: {'name': name});
+      problemMessage: """Can't break to '${name}'.""",
+      arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5788,7 +5902,7 @@
 const MessageCode messageInvalidCatchArguments = const MessageCode(
     "InvalidCatchArguments",
     analyzerCodes: <String>["INVALID_CATCH_ARGUMENTS"],
-    message: r"""Invalid catch arguments.""");
+    problemMessage: r"""Invalid catch arguments.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInvalidCodePoint = messageInvalidCodePoint;
@@ -5797,13 +5911,13 @@
 const MessageCode messageInvalidCodePoint = const MessageCode(
     "InvalidCodePoint",
     analyzerCodes: <String>["INVALID_CODE_POINT"],
-    message:
+    problemMessage:
         r"""The escape sequence starting with '\u' isn't a valid code point.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateInvalidContinueTarget =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Can't continue at '#name'.""",
+        problemMessageTemplate: r"""Can't continue at '#name'.""",
         withArguments: _withArgumentsInvalidContinueTarget);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5817,14 +5931,16 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeInvalidContinueTarget,
-      message: """Can't continue at '${name}'.""", arguments: {'name': name});
+      problemMessage: """Can't continue at '${name}'.""",
+      arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateInvalidGetterSetterTypeFieldContext =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""This is the declaration of the field '#name'.""",
+        problemMessageTemplate:
+            r"""This is the declaration of the field '#name'.""",
         withArguments: _withArgumentsInvalidGetterSetterTypeFieldContext);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5839,7 +5955,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeInvalidGetterSetterTypeFieldContext,
-      message: """This is the declaration of the field '${name}'.""",
+      problemMessage: """This is the declaration of the field '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -5847,7 +5963,8 @@
 const Template<Message Function(String name)>
     templateInvalidGetterSetterTypeGetterContext =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""This is the declaration of the getter '#name'.""",
+        problemMessageTemplate:
+            r"""This is the declaration of the getter '#name'.""",
         withArguments: _withArgumentsInvalidGetterSetterTypeGetterContext);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5862,7 +5979,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeInvalidGetterSetterTypeGetterContext,
-      message: """This is the declaration of the getter '${name}'.""",
+      problemMessage: """This is the declaration of the getter '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -5870,7 +5987,8 @@
 const Template<Message Function(String name)>
     templateInvalidGetterSetterTypeSetterContext =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""This is the declaration of the setter '#name'.""",
+        problemMessageTemplate:
+            r"""This is the declaration of the setter '#name'.""",
         withArguments: _withArgumentsInvalidGetterSetterTypeSetterContext);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5885,7 +6003,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeInvalidGetterSetterTypeSetterContext,
-      message: """This is the declaration of the setter '${name}'.""",
+      problemMessage: """This is the declaration of the setter '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -5896,7 +6014,7 @@
 const MessageCode messageInvalidHexEscape = const MessageCode(
     "InvalidHexEscape",
     index: 40,
-    message:
+    problemMessage:
         r"""An escape sequence starting with '\x' must be followed by 2 hexadecimal digits.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5906,8 +6024,9 @@
 const MessageCode messageInvalidInitializer = const MessageCode(
     "InvalidInitializer",
     index: 90,
-    message: r"""Not a valid initializer.""",
-    tip: r"""To initialize a field, use the syntax 'name = value'.""");
+    problemMessage: r"""Not a valid initializer.""",
+    correctionMessage:
+        r"""To initialize a field, use the syntax 'name = value'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInvalidInlineFunctionType =
@@ -5917,9 +6036,9 @@
 const MessageCode messageInvalidInlineFunctionType = const MessageCode(
     "InvalidInlineFunctionType",
     analyzerCodes: <String>["INVALID_INLINE_FUNCTION_TYPE"],
-    message:
+    problemMessage:
         r"""Inline function types cannot be used for parameters in a generic function type.""",
-    tip:
+    correctionMessage:
         r"""Try changing the inline function type (as in 'int f()') to a prefixed function type using the `Function` keyword (as in 'int Function() f').""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5928,12 +6047,12 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInvalidNnbdDillLibrary = const MessageCode(
     "InvalidNnbdDillLibrary",
-    message: r"""Trying to use library with invalid null safety.""");
+    problemMessage: r"""Trying to use library with invalid null safety.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateInvalidOperator =
     const Template<Message Function(Token token)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The string '#lexeme' isn't a user-definable operator.""",
         withArguments: _withArgumentsInvalidOperator);
 
@@ -5945,7 +6064,8 @@
 Message _withArgumentsInvalidOperator(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeInvalidOperator,
-      message: """The string '${lexeme}' isn't a user-definable operator.""",
+      problemMessage:
+          """The string '${lexeme}' isn't a user-definable operator.""",
       arguments: {'lexeme': token});
 }
 
@@ -5953,7 +6073,7 @@
 const Template<Message Function(Uri uri_, String string)>
     templateInvalidPackageUri =
     const Template<Message Function(Uri uri_, String string)>(
-        messageTemplate: r"""Invalid package URI '#uri':
+        problemMessageTemplate: r"""Invalid package URI '#uri':
   #string.""", withArguments: _withArgumentsInvalidPackageUri);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5967,7 +6087,7 @@
   String? uri = relativizeUri(uri_);
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeInvalidPackageUri,
-      message: """Invalid package URI '${uri}':
+      problemMessage: """Invalid package URI '${uri}':
   ${string}.""", arguments: {'uri': uri_, 'string': string});
 }
 
@@ -5979,7 +6099,7 @@
 const MessageCode messageInvalidSuperInInitializer = const MessageCode(
     "InvalidSuperInInitializer",
     index: 47,
-    message:
+    problemMessage:
         r"""Can only use 'super' in an initializer for calling the superclass constructor (e.g. 'super()' or 'super.namedConstructor()')""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5989,8 +6109,8 @@
 const MessageCode messageInvalidSyncModifier = const MessageCode(
     "InvalidSyncModifier",
     analyzerCodes: <String>["MISSING_STAR_AFTER_SYNC"],
-    message: r"""Invalid modifier 'sync'.""",
-    tip: r"""Try replacing 'sync' with 'sync*'.""");
+    problemMessage: r"""Invalid modifier 'sync'.""",
+    correctionMessage: r"""Try replacing 'sync' with 'sync*'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInvalidThisInInitializer = messageInvalidThisInInitializer;
@@ -5999,7 +6119,7 @@
 const MessageCode messageInvalidThisInInitializer = const MessageCode(
     "InvalidThisInInitializer",
     index: 65,
-    message:
+    problemMessage:
         r"""Can only use 'this' in an initializer for field initialization (e.g. 'this.x = something') and constructor redirection (e.g. 'this()' or 'this.namedConstructor())""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6009,8 +6129,9 @@
         String string2,
         String
             name2)> templateInvalidTypeVariableInSupertype = const Template<
-        Message Function(String name, String string2, String name2)>(
-    messageTemplate:
+        Message Function(
+            String name, String string2, String name2)>(
+    problemMessageTemplate:
         r"""Can't use implicitly 'out' variable '#name' in an '#string2' position in supertype '#name2'.""",
     withArguments: _withArgumentsInvalidTypeVariableInSupertype);
 
@@ -6030,7 +6151,7 @@
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   return new Message(codeInvalidTypeVariableInSupertype,
-      message:
+      problemMessage:
           """Can't use implicitly 'out' variable '${name}' in an '${string2}' position in supertype '${name2}'.""",
       arguments: {'name': name, 'string2': string2, 'name2': name2});
 }
@@ -6042,7 +6163,7 @@
     templateInvalidTypeVariableInSupertypeWithVariance = const Template<
             Message Function(
                 String string, String name, String string2, String name2)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't use '#string' type variable '#name' in an '#string2' position in supertype '#name2'.""",
         withArguments:
             _withArgumentsInvalidTypeVariableInSupertypeWithVariance);
@@ -6067,7 +6188,7 @@
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   return new Message(codeInvalidTypeVariableInSupertypeWithVariance,
-      message:
+      problemMessage:
           """Can't use '${string}' type variable '${name}' in an '${string2}' position in supertype '${name2}'.""",
       arguments: {
         'string': string,
@@ -6085,7 +6206,7 @@
         String
             string2)> templateInvalidTypeVariableVariancePosition = const Template<
         Message Function(String string, String name, String string2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Can't use '#string' type variable '#name' in an '#string2' position.""",
     withArguments: _withArgumentsInvalidTypeVariableVariancePosition);
 
@@ -6104,7 +6225,7 @@
   name = demangleMixinApplicationName(name);
   if (string2.isEmpty) throw 'No string provided';
   return new Message(codeInvalidTypeVariableVariancePosition,
-      message:
+      problemMessage:
           """Can't use '${string}' type variable '${name}' in an '${string2}' position.""",
       arguments: {'string': string, 'name': name, 'string2': string2});
 }
@@ -6113,7 +6234,7 @@
 const Template<Message Function(String string, String name, String string2)>
     templateInvalidTypeVariableVariancePositionInReturnType = const Template<
             Message Function(String string, String name, String string2)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't use '#string' type variable '#name' in an '#string2' position in the return type.""",
         withArguments:
             _withArgumentsInvalidTypeVariableVariancePositionInReturnType);
@@ -6133,7 +6254,7 @@
   name = demangleMixinApplicationName(name);
   if (string2.isEmpty) throw 'No string provided';
   return new Message(codeInvalidTypeVariableVariancePositionInReturnType,
-      message:
+      problemMessage:
           """Can't use '${string}' type variable '${name}' in an '${string2}' position in the return type.""",
       arguments: {'string': string, 'name': name, 'string2': string2});
 }
@@ -6145,7 +6266,7 @@
 const MessageCode messageInvalidUnicodeEscape = const MessageCode(
     "InvalidUnicodeEscape",
     index: 38,
-    message:
+    problemMessage:
         r"""An escape sequence starting with '\u' must be followed by 4 hexadecimal digits or from 1 to 6 digits between '{' and '}'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6156,8 +6277,8 @@
 const MessageCode messageInvalidUseOfNullAwareAccess = const MessageCode(
     "InvalidUseOfNullAwareAccess",
     analyzerCodes: <String>["INVALID_USE_OF_NULL_AWARE_ACCESS"],
-    message: r"""Cannot use '?.' here.""",
-    tip: r"""Try using '.'.""");
+    problemMessage: r"""Cannot use '?.' here.""",
+    correctionMessage: r"""Try using '.'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInvalidVoid = messageInvalidVoid;
@@ -6165,14 +6286,14 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInvalidVoid = const MessageCode("InvalidVoid",
     analyzerCodes: <String>["EXPECTED_TYPE_NAME"],
-    message: r"""Type 'void' can't be used here.""",
-    tip:
+    problemMessage: r"""Type 'void' can't be used here.""",
+    correctionMessage:
         r"""Try removing 'void' keyword or replace it with 'var', 'final', or a type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateInvokeNonFunction =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""'#name' isn't a function or method and can't be invoked.""",
         withArguments: _withArgumentsInvokeNonFunction);
 
@@ -6186,7 +6307,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeInvokeNonFunction,
-      message: """'${name}' isn't a function or method and can't be invoked.""",
+      problemMessage:
+          """'${name}' isn't a function or method and can't be invoked.""",
       arguments: {'name': name});
 }
 
@@ -6197,9 +6319,10 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageJsInteropAnonymousFactoryPositionalParameters =
     const MessageCode("JsInteropAnonymousFactoryPositionalParameters",
-        message:
+        problemMessage:
             r"""Factory constructors for @anonymous JS interop classes should not contain any positional parameters.""",
-        tip: r"""Try replacing them with named parameters instead.""");
+        correctionMessage:
+            r"""Try replacing them with named parameters instead.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -6208,9 +6331,9 @@
         String
             name2)> templateJsInteropDartClassExtendsJSClass = const Template<
         Message Function(String name, String name2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Dart class '#name' cannot extend JS interop class '#name2'.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try adding the JS interop annotation or removing it from the parent class.""",
     withArguments: _withArgumentsJsInteropDartClassExtendsJSClass);
 
@@ -6229,9 +6352,9 @@
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   return new Message(codeJsInteropDartClassExtendsJSClass,
-      message:
+      problemMessage:
           """Dart class '${name}' cannot extend JS interop class '${name2}'.""",
-      tip:
+      correctionMessage:
           """Try adding the JS interop annotation or removing it from the parent class.""",
       arguments: {'name': name, 'name2': name2});
 }
@@ -6243,9 +6366,10 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageJsInteropEnclosingClassJSAnnotation = const MessageCode(
     "JsInteropEnclosingClassJSAnnotation",
-    message:
+    problemMessage:
         r"""Member has a JS interop annotation but the enclosing class does not.""",
-    tip: r"""Try adding the annotation to the enclosing class.""");
+    correctionMessage:
+        r"""Try adding the annotation to the enclosing class.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeJsInteropEnclosingClassJSAnnotationContext =
@@ -6255,7 +6379,7 @@
 const MessageCode messageJsInteropEnclosingClassJSAnnotationContext =
     const MessageCode("JsInteropEnclosingClassJSAnnotationContext",
         severity: Severity.context,
-        message: r"""This is the enclosing class.""");
+        problemMessage: r"""This is the enclosing class.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeJsInteropExternalExtensionMemberOnTypeInvalid =
@@ -6264,9 +6388,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageJsInteropExternalExtensionMemberOnTypeInvalid =
     const MessageCode("JsInteropExternalExtensionMemberOnTypeInvalid",
-        message:
+        problemMessage:
             r"""JS interop or Native class required for 'external' extension members.""",
-        tip:
+        correctionMessage:
             r"""Try adding a JS interop annotation to the on type class of the extension.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6276,8 +6400,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageJsInteropExternalMemberNotJSAnnotated = const MessageCode(
     "JsInteropExternalMemberNotJSAnnotated",
-    message: r"""Only JS interop members may be 'external'.""",
-    tip:
+    problemMessage: r"""Only JS interop members may be 'external'.""",
+    correctionMessage:
         r"""Try removing the 'external' keyword or adding a JS interop annotation.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6287,9 +6411,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageJsInteropIndexNotSupported = const MessageCode(
     "JsInteropIndexNotSupported",
-    message:
+    problemMessage:
         r"""JS interop classes do not support [] and []= operator methods.""",
-    tip: r"""Try replacing with a normal method.""");
+    correctionMessage: r"""Try replacing with a normal method.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -6298,9 +6422,9 @@
         String
             name2)> templateJsInteropJSClassExtendsDartClass = const Template<
         Message Function(String name, String name2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""JS interop class '#name' cannot extend Dart class '#name2'.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try removing the JS interop annotation or adding it to the parent class.""",
     withArguments: _withArgumentsJsInteropJSClassExtendsDartClass);
 
@@ -6319,9 +6443,9 @@
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   return new Message(codeJsInteropJSClassExtendsDartClass,
-      message:
+      problemMessage:
           """JS interop class '${name}' cannot extend Dart class '${name2}'.""",
-      tip:
+      correctionMessage:
           """Try removing the JS interop annotation or adding it to the parent class.""",
       arguments: {'name': name, 'name2': name2});
 }
@@ -6332,9 +6456,10 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageJsInteropNamedParameters = const MessageCode(
     "JsInteropNamedParameters",
-    message:
+    problemMessage:
         r"""Named parameters for JS interop functions are only allowed in a factory constructor of an @anonymous JS class.""",
-    tip: r"""Try replacing them with normal or optional parameters.""");
+    correctionMessage:
+        r"""Try replacing them with normal or optional parameters.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -6343,10 +6468,11 @@
         String name2,
         String
             string3)> templateJsInteropNativeClassInAnnotation = const Template<
-        Message Function(String name, String name2, String string3)>(
-    messageTemplate:
+        Message Function(
+            String name, String name2, String string3)>(
+    problemMessageTemplate:
         r"""JS interop class '#name' conflicts with natively supported class '#name2' in '#string3'.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try making the @JS class into an @anonymous class or use js_util on the JS object.""",
     withArguments: _withArgumentsJsInteropNativeClassInAnnotation);
 
@@ -6366,9 +6492,9 @@
   name2 = demangleMixinApplicationName(name2);
   if (string3.isEmpty) throw 'No string provided';
   return new Message(codeJsInteropNativeClassInAnnotation,
-      message:
+      problemMessage:
           """JS interop class '${name}' conflicts with natively supported class '${name2}' in '${string3}'.""",
-      tip: """Try making the @JS class into an @anonymous class or use js_util on the JS object.""",
+      correctionMessage: """Try making the @JS class into an @anonymous class or use js_util on the JS object.""",
       arguments: {'name': name, 'name2': name2, 'string3': string3});
 }
 
@@ -6379,9 +6505,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageJsInteropNonExternalConstructor = const MessageCode(
     "JsInteropNonExternalConstructor",
-    message:
+    problemMessage:
         r"""JS interop classes do not support non-external constructors.""",
-    tip: r"""Try annotating with `external`.""");
+    correctionMessage: r"""Try annotating with `external`.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeJsInteropNonExternalMember =
@@ -6390,16 +6516,16 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageJsInteropNonExternalMember = const MessageCode(
     "JsInteropNonExternalMember",
-    message:
+    problemMessage:
         r"""This JS interop member must be annotated with `external`. Only factories and static methods can be non-external.""",
-    tip: r"""Try annotating the member with `external`.""");
+    correctionMessage: r"""Try annotating the member with `external`.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(String name)> templateLabelNotFound = const Template<
         Message Function(String name)>(
-    messageTemplate: r"""Can't find label '#name'.""",
-    tipTemplate:
+    problemMessageTemplate: r"""Can't find label '#name'.""",
+    correctionMessageTemplate:
         r"""Try defining the label, or correcting the name to match an existing label.""",
     withArguments: _withArgumentsLabelNotFound);
 
@@ -6413,8 +6539,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeLabelNotFound,
-      message: """Can't find label '${name}'.""",
-      tip:
+      problemMessage: """Can't find label '${name}'.""",
+      correctionMessage:
           """Try defining the label, or correcting the name to match an existing label.""",
       arguments: {'name': name});
 }
@@ -6426,7 +6552,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageLanguageVersionInvalidInDotPackages = const MessageCode(
     "LanguageVersionInvalidInDotPackages",
-    message:
+    problemMessage:
         r"""The language version is not specified correctly in the packages file.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6437,7 +6563,7 @@
 const MessageCode messageLanguageVersionLibraryContext = const MessageCode(
     "LanguageVersionLibraryContext",
     severity: Severity.context,
-    message: r"""This is language version annotation in the library.""");
+    problemMessage: r"""This is language version annotation in the library.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeLanguageVersionMismatchInPart =
@@ -6446,7 +6572,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageLanguageVersionMismatchInPart = const MessageCode(
     "LanguageVersionMismatchInPart",
-    message:
+    problemMessage:
         r"""The language version override has to be the same in the library and its part(s).""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6456,7 +6582,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageLanguageVersionMismatchInPatch = const MessageCode(
     "LanguageVersionMismatchInPatch",
-    message:
+    problemMessage:
         r"""The language version override has to be the same in the library and its patch(es).""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6467,7 +6593,7 @@
 const MessageCode messageLanguageVersionPartContext = const MessageCode(
     "LanguageVersionPartContext",
     severity: Severity.context,
-    message: r"""This is language version annotation in the part.""");
+    problemMessage: r"""This is language version annotation in the part.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeLanguageVersionPatchContext =
@@ -6477,7 +6603,7 @@
 const MessageCode messageLanguageVersionPatchContext = const MessageCode(
     "LanguageVersionPatchContext",
     severity: Severity.context,
-    message: r"""This is language version annotation in the patch.""");
+    problemMessage: r"""This is language version annotation in the patch.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -6486,7 +6612,7 @@
         int
             count2)> templateLanguageVersionTooHigh = const Template<
         Message Function(int count, int count2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The specified language version is too high. The highest supported language version is #count.#count2.""",
     withArguments: _withArgumentsLanguageVersionTooHigh);
 
@@ -6503,7 +6629,7 @@
   // ignore: unnecessary_null_comparison
   if (count2 == null) throw 'No count provided';
   return new Message(codeLanguageVersionTooHigh,
-      message:
+      problemMessage:
           """The specified language version is too high. The highest supported language version is ${count}.${count2}.""",
       arguments: {'count': count, 'count2': count2});
 }
@@ -6512,7 +6638,7 @@
 const Template<Message Function(String name)>
     templateLateDefinitelyAssignedError =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Late final variable '#name' definitely assigned.""",
         withArguments: _withArgumentsLateDefinitelyAssignedError);
 
@@ -6527,7 +6653,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeLateDefinitelyAssignedError,
-      message: """Late final variable '${name}' definitely assigned.""",
+      problemMessage: """Late final variable '${name}' definitely assigned.""",
       arguments: {'name': name});
 }
 
@@ -6537,7 +6663,7 @@
         String
             name)> templateLateDefinitelyUnassignedError = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Late variable '#name' without initializer is definitely unassigned.""",
     withArguments: _withArgumentsLateDefinitelyUnassignedError);
 
@@ -6552,7 +6678,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeLateDefinitelyUnassignedError,
-      message:
+      problemMessage:
           """Late variable '${name}' without initializer is definitely unassigned.""",
       arguments: {'name': name});
 }
@@ -6564,9 +6690,10 @@
 const MessageCode messageLibraryDirectiveNotFirst = const MessageCode(
     "LibraryDirectiveNotFirst",
     index: 37,
-    message:
+    problemMessage:
         r"""The library directive must appear before all other directives.""",
-    tip: r"""Try moving the library directive before any other directives.""");
+    correctionMessage:
+        r"""Try moving the library directive before any other directives.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeListLiteralTooManyTypeArguments =
@@ -6576,15 +6703,15 @@
 const MessageCode messageListLiteralTooManyTypeArguments = const MessageCode(
     "ListLiteralTooManyTypeArguments",
     analyzerCodes: <String>["EXPECTED_ONE_LIST_TYPE_ARGUMENTS"],
-    message: r"""List literal requires exactly one type argument.""");
+    problemMessage: r"""List literal requires exactly one type argument.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string, Token token)>
     templateLiteralWithClass =
     const Template<Message Function(String string, Token token)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""A #string literal can't be prefixed by '#lexeme'.""",
-        tipTemplate: r"""Try removing '#lexeme'""",
+        correctionMessageTemplate: r"""Try removing '#lexeme'""",
         withArguments: _withArgumentsLiteralWithClass);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6597,18 +6724,20 @@
   if (string.isEmpty) throw 'No string provided';
   String lexeme = token.lexeme;
   return new Message(codeLiteralWithClass,
-      message: """A ${string} literal can't be prefixed by '${lexeme}'.""",
-      tip: """Try removing '${lexeme}'""",
+      problemMessage:
+          """A ${string} literal can't be prefixed by '${lexeme}'.""",
+      correctionMessage: """Try removing '${lexeme}'""",
       arguments: {'string': string, 'lexeme': token});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String string, Token token)>
+const Template<
+        Message Function(String string, Token token)>
     templateLiteralWithClassAndNew =
     const Template<Message Function(String string, Token token)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""A #string literal can't be prefixed by 'new #lexeme'.""",
-        tipTemplate: r"""Try removing 'new' and '#lexeme'""",
+        correctionMessageTemplate: r"""Try removing 'new' and '#lexeme'""",
         withArguments: _withArgumentsLiteralWithClassAndNew);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6623,8 +6752,9 @@
   if (string.isEmpty) throw 'No string provided';
   String lexeme = token.lexeme;
   return new Message(codeLiteralWithClassAndNew,
-      message: """A ${string} literal can't be prefixed by 'new ${lexeme}'.""",
-      tip: """Try removing 'new' and '${lexeme}'""",
+      problemMessage:
+          """A ${string} literal can't be prefixed by 'new ${lexeme}'.""",
+      correctionMessage: """Try removing 'new' and '${lexeme}'""",
       arguments: {'string': string, 'lexeme': token});
 }
 
@@ -6634,8 +6764,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageLiteralWithNew = const MessageCode("LiteralWithNew",
     index: 117,
-    message: r"""A literal can't be prefixed by 'new'.""",
-    tip: r"""Try removing 'new'""");
+    problemMessage: r"""A literal can't be prefixed by 'new'.""",
+    correctionMessage: r"""Try removing 'new'""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeLoadLibraryTakesNoArguments =
@@ -6645,7 +6775,7 @@
 const MessageCode messageLoadLibraryTakesNoArguments = const MessageCode(
     "LoadLibraryTakesNoArguments",
     analyzerCodes: <String>["LOAD_LIBRARY_TAKES_NO_ARGUMENTS"],
-    message: r"""'loadLibrary' takes no arguments.""");
+    problemMessage: r"""'loadLibrary' takes no arguments.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMainNotFunctionDeclaration =
@@ -6654,7 +6784,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMainNotFunctionDeclaration = const MessageCode(
     "MainNotFunctionDeclaration",
-    message: r"""The 'main' declaration must be a function declaration.""");
+    problemMessage:
+        r"""The 'main' declaration must be a function declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMainNotFunctionDeclarationExported =
@@ -6663,7 +6794,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMainNotFunctionDeclarationExported = const MessageCode(
     "MainNotFunctionDeclarationExported",
-    message:
+    problemMessage:
         r"""The exported 'main' declaration must be a function declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6673,7 +6804,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMainRequiredNamedParameters = const MessageCode(
     "MainRequiredNamedParameters",
-    message: r"""The 'main' method cannot have required named parameters.""");
+    problemMessage:
+        r"""The 'main' method cannot have required named parameters.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMainRequiredNamedParametersExported =
@@ -6682,7 +6814,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMainRequiredNamedParametersExported = const MessageCode(
     "MainRequiredNamedParametersExported",
-    message:
+    problemMessage:
         r"""The exported 'main' method cannot have required named parameters.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6692,7 +6824,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMainTooManyRequiredParameters = const MessageCode(
     "MainTooManyRequiredParameters",
-    message: r"""The 'main' method must have at most 2 required parameters.""");
+    problemMessage:
+        r"""The 'main' method must have at most 2 required parameters.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMainTooManyRequiredParametersExported =
@@ -6701,7 +6834,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMainTooManyRequiredParametersExported = const MessageCode(
     "MainTooManyRequiredParametersExported",
-    message:
+    problemMessage:
         r"""The exported 'main' method must have at most 2 required parameters.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6712,12 +6845,12 @@
 const MessageCode messageMapLiteralTypeArgumentMismatch = const MessageCode(
     "MapLiteralTypeArgumentMismatch",
     analyzerCodes: <String>["EXPECTED_TWO_MAP_TYPE_ARGUMENTS"],
-    message: r"""A map literal requires exactly two type arguments.""");
+    problemMessage: r"""A map literal requires exactly two type arguments.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateMemberNotFound =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Member not found: '#name'.""",
+        problemMessageTemplate: r"""Member not found: '#name'.""",
         withArguments: _withArgumentsMemberNotFound);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6730,7 +6863,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeMemberNotFound,
-      message: """Member not found: '${name}'.""", arguments: {'name': name});
+      problemMessage: """Member not found: '${name}'.""",
+      arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6741,9 +6875,9 @@
 const MessageCode messageMemberWithSameNameAsClass = const MessageCode(
     "MemberWithSameNameAsClass",
     index: 105,
-    message:
+    problemMessage:
         r"""A class member can't have the same name as the enclosing class.""",
-    tip: r"""Try renaming the member.""");
+    correctionMessage: r"""Try renaming the member.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMetadataTypeArguments = messageMetadataTypeArguments;
@@ -6752,7 +6886,7 @@
 const MessageCode messageMetadataTypeArguments = const MessageCode(
     "MetadataTypeArguments",
     index: 91,
-    message: r"""An annotation can't use type arguments.""");
+    problemMessage: r"""An annotation can't use type arguments.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMetadataTypeArgumentsUninstantiated =
@@ -6762,13 +6896,13 @@
 const MessageCode messageMetadataTypeArgumentsUninstantiated = const MessageCode(
     "MetadataTypeArgumentsUninstantiated",
     index: 114,
-    message:
+    problemMessage:
         r"""An annotation with type arguments must be followed by an argument list.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateMethodNotFound =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Method not found: '#name'.""",
+        problemMessageTemplate: r"""Method not found: '#name'.""",
         withArguments: _withArgumentsMethodNotFound);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6781,7 +6915,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeMethodNotFound,
-      message: """Method not found: '${name}'.""", arguments: {'name': name});
+      problemMessage: """Method not found: '${name}'.""",
+      arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6790,7 +6925,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMissingArgumentList = const MessageCode(
     "MissingArgumentList",
-    message: r"""Constructor invocations must have an argument list.""");
+    problemMessage: r"""Constructor invocations must have an argument list.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMissingAssignableSelector =
@@ -6800,8 +6935,8 @@
 const MessageCode messageMissingAssignableSelector = const MessageCode(
     "MissingAssignableSelector",
     index: 35,
-    message: r"""Missing selector such as '.identifier' or '[0]'.""",
-    tip: r"""Try adding a selector.""");
+    problemMessage: r"""Missing selector such as '.identifier' or '[0]'.""",
+    correctionMessage: r"""Try adding a selector.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMissingAssignmentInInitializer =
@@ -6811,8 +6946,9 @@
 const MessageCode messageMissingAssignmentInInitializer = const MessageCode(
     "MissingAssignmentInInitializer",
     index: 34,
-    message: r"""Expected an assignment after the field name.""",
-    tip: r"""To initialize a field, use the syntax 'name = value'.""");
+    problemMessage: r"""Expected an assignment after the field name.""",
+    correctionMessage:
+        r"""To initialize a field, use the syntax 'name = value'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMissingConstFinalVarOrType =
@@ -6822,9 +6958,9 @@
 const MessageCode messageMissingConstFinalVarOrType = const MessageCode(
     "MissingConstFinalVarOrType",
     index: 33,
-    message:
+    problemMessage:
         r"""Variables must be declared using the keywords 'const', 'final', 'var' or a type name.""",
-    tip:
+    correctionMessage:
         r"""Try adding the name of the type of the variable or the keyword 'var'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6834,8 +6970,8 @@
 const MessageCode messageMissingExplicitConst = const MessageCode(
     "MissingExplicitConst",
     analyzerCodes: <String>["NOT_CONSTANT_EXPRESSION"],
-    message: r"""Constant expression expected.""",
-    tip: r"""Try inserting 'const'.""");
+    problemMessage: r"""Constant expression expected.""",
+    correctionMessage: r"""Try inserting 'const'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMissingExponent = messageMissingExponent;
@@ -6843,9 +6979,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMissingExponent = const MessageCode("MissingExponent",
     analyzerCodes: <String>["MISSING_DIGIT"],
-    message:
+    problemMessage:
         r"""Numbers in exponential notation should always contain an exponent (an integer number with an optional sign).""",
-    tip:
+    correctionMessage:
         r"""Make sure there is an exponent, and remove any whitespace before it.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6855,8 +6991,8 @@
 const MessageCode messageMissingExpressionInThrow = const MessageCode(
     "MissingExpressionInThrow",
     index: 32,
-    message: r"""Missing expression after 'throw'.""",
-    tip:
+    problemMessage: r"""Missing expression after 'throw'.""",
+    correctionMessage:
         r"""Add an expression after 'throw' or use 'rethrow' to throw a caught exception""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6867,15 +7003,16 @@
 const MessageCode messageMissingFunctionParameters = const MessageCode(
     "MissingFunctionParameters",
     analyzerCodes: <String>["MISSING_FUNCTION_PARAMETERS"],
-    message:
+    problemMessage:
         r"""A function declaration needs an explicit list of parameters.""",
-    tip: r"""Try adding a parameter list to the function declaration.""");
+    correctionMessage:
+        r"""Try adding a parameter list to the function declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateMissingImplementationCause =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""'#name' is defined here.""",
+        problemMessageTemplate: r"""'#name' is defined here.""",
         withArguments: _withArgumentsMissingImplementationCause);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6888,7 +7025,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeMissingImplementationCause,
-      message: """'${name}' is defined here.""", arguments: {'name': name});
+      problemMessage: """'${name}' is defined here.""",
+      arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6898,10 +7036,10 @@
         List<String>
             _names)> templateMissingImplementationNotAbstract = const Template<
         Message Function(String name, List<String> _names)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The non-abstract class '#name' is missing implementations for these members:
 #names""",
-    tipTemplate: r"""Try to either
+    correctionMessageTemplate: r"""Try to either
  - provide an implementation,
  - inherit an implementation from a superclass or mixin,
  - mark the class as abstract, or
@@ -6924,10 +7062,10 @@
   if (_names.isEmpty) throw 'No names provided';
   String names = itemizeNames(_names);
   return new Message(codeMissingImplementationNotAbstract,
-      message:
+      problemMessage:
           """The non-abstract class '${name}' is missing implementations for these members:
 ${names}""",
-      tip: """Try to either
+      correctionMessage: """Try to either
  - provide an implementation,
  - inherit an implementation from a superclass or mixin,
  - mark the class as abstract, or
@@ -6941,15 +7079,16 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMissingInput = const MessageCode("MissingInput",
-    message: r"""No input file provided to the compiler.""");
+    problemMessage: r"""No input file provided to the compiler.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMissingMain = messageMissingMain;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMissingMain = const MessageCode("MissingMain",
-    message: r"""No 'main' method found.""",
-    tip: r"""Try adding a method named 'main' to your program.""");
+    problemMessage: r"""No 'main' method found.""",
+    correctionMessage:
+        r"""Try adding a method named 'main' to your program.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMissingMethodParameters = messageMissingMethodParameters;
@@ -6958,8 +7097,10 @@
 const MessageCode messageMissingMethodParameters = const MessageCode(
     "MissingMethodParameters",
     analyzerCodes: <String>["MISSING_METHOD_PARAMETERS"],
-    message: r"""A method declaration needs an explicit list of parameters.""",
-    tip: r"""Try adding a parameter list to the method declaration.""");
+    problemMessage:
+        r"""A method declaration needs an explicit list of parameters.""",
+    correctionMessage:
+        r"""Try adding a parameter list to the method declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMissingOperatorKeyword = messageMissingOperatorKeyword;
@@ -6968,15 +7109,15 @@
 const MessageCode messageMissingOperatorKeyword = const MessageCode(
     "MissingOperatorKeyword",
     index: 31,
-    message:
+    problemMessage:
         r"""Operator declarations must be preceded by the keyword 'operator'.""",
-    tip: r"""Try adding the keyword 'operator'.""");
+    correctionMessage: r"""Try adding the keyword 'operator'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(Uri uri_)> templateMissingPartOf = const Template<
         Message Function(Uri uri_)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Can't use '#uri' as a part, because it has no 'part of' declaration.""",
     withArguments: _withArgumentsMissingPartOf);
 
@@ -6989,7 +7130,7 @@
 Message _withArgumentsMissingPartOf(Uri uri_) {
   String? uri = relativizeUri(uri_);
   return new Message(codeMissingPartOf,
-      message:
+      problemMessage:
           """Can't use '${uri}' as a part, because it has no 'part of' declaration.""",
       arguments: {'uri': uri_});
 }
@@ -7002,8 +7143,9 @@
 const MessageCode messageMissingPrefixInDeferredImport = const MessageCode(
     "MissingPrefixInDeferredImport",
     index: 30,
-    message: r"""Deferred imports should have a prefix.""",
-    tip: r"""Try adding a prefix to the import by adding an 'as' clause.""");
+    problemMessage: r"""Deferred imports should have a prefix.""",
+    correctionMessage:
+        r"""Try adding a prefix to the import by adding an 'as' clause.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMissingTypedefParameters = messageMissingTypedefParameters;
@@ -7012,8 +7154,8 @@
 const MessageCode messageMissingTypedefParameters = const MessageCode(
     "MissingTypedefParameters",
     analyzerCodes: <String>["MISSING_TYPEDEF_PARAMETERS"],
-    message: r"""A typedef needs an explicit list of parameters.""",
-    tip: r"""Try adding a parameter list to the typedef.""");
+    problemMessage: r"""A typedef needs an explicit list of parameters.""",
+    correctionMessage: r"""Try adding a parameter list to the typedef.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMixinDeclaresConstructor = messageMixinDeclaresConstructor;
@@ -7022,7 +7164,7 @@
 const MessageCode messageMixinDeclaresConstructor = const MessageCode(
     "MixinDeclaresConstructor",
     index: 95,
-    message: r"""Mixins can't declare constructors.""");
+    problemMessage: r"""Mixins can't declare constructors.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMixinFunction = messageMixinFunction;
@@ -7030,8 +7172,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMixinFunction = const MessageCode("MixinFunction",
     severity: Severity.ignored,
-    message: r"""Mixing in 'Function' is deprecated.""",
-    tip: r"""Try removing 'Function' from the 'with' clause.""");
+    problemMessage: r"""Mixing in 'Function' is deprecated.""",
+    correctionMessage: r"""Try removing 'Function' from the 'with' clause.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -7040,9 +7182,9 @@
         String
             string2)> templateModifierOutOfOrder = const Template<
         Message Function(String string, String string2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The modifier '#string' should be before the modifier '#string2'.""",
-    tipTemplate: r"""Try re-ordering the modifiers.""",
+    correctionMessageTemplate: r"""Try re-ordering the modifiers.""",
     withArguments: _withArgumentsModifierOutOfOrder);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7057,9 +7199,9 @@
   if (string.isEmpty) throw 'No string provided';
   if (string2.isEmpty) throw 'No string provided';
   return new Message(codeModifierOutOfOrder,
-      message:
+      problemMessage:
           """The modifier '${string}' should be before the modifier '${string2}'.""",
-      tip: """Try re-ordering the modifiers.""",
+      correctionMessage: """Try re-ordering the modifiers.""",
       arguments: {'string': string, 'string2': string2});
 }
 
@@ -7071,7 +7213,7 @@
 const MessageCode messageMoreThanOneSuperInitializer = const MessageCode(
     "MoreThanOneSuperInitializer",
     analyzerCodes: <String>["MULTIPLE_SUPER_INITIALIZERS"],
-    message: r"""Can't have more than one 'super' initializer.""");
+    problemMessage: r"""Can't have more than one 'super' initializer.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMultipleExtends = messageMultipleExtends;
@@ -7079,8 +7221,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMultipleExtends = const MessageCode("MultipleExtends",
     index: 28,
-    message: r"""Each class definition can have at most one extends clause.""",
-    tip:
+    problemMessage:
+        r"""Each class definition can have at most one extends clause.""",
+    correctionMessage:
         r"""Try choosing one superclass and define your class to implement (or mix in) the others.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7090,9 +7233,9 @@
 const MessageCode messageMultipleImplements = const MessageCode(
     "MultipleImplements",
     analyzerCodes: <String>["MULTIPLE_IMPLEMENTS_CLAUSES"],
-    message:
+    problemMessage:
         r"""Each class definition can have at most one implements clause.""",
-    tip:
+    correctionMessage:
         r"""Try combining all of the implements clauses into a single clause.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7103,8 +7246,10 @@
 const MessageCode messageMultipleLibraryDirectives = const MessageCode(
     "MultipleLibraryDirectives",
     index: 27,
-    message: r"""Only one library directive may be declared in a file.""",
-    tip: r"""Try removing all but one of the library directives.""");
+    problemMessage:
+        r"""Only one library directive may be declared in a file.""",
+    correctionMessage:
+        r"""Try removing all but one of the library directives.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMultipleOnClauses = messageMultipleOnClauses;
@@ -7113,8 +7258,10 @@
 const MessageCode messageMultipleOnClauses = const MessageCode(
     "MultipleOnClauses",
     index: 26,
-    message: r"""Each mixin definition can have at most one on clause.""",
-    tip: r"""Try combining all of the on clauses into a single clause.""");
+    problemMessage:
+        r"""Each mixin definition can have at most one on clause.""",
+    correctionMessage:
+        r"""Try combining all of the on clauses into a single clause.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMultipleVarianceModifiers =
@@ -7124,8 +7271,10 @@
 const MessageCode messageMultipleVarianceModifiers = const MessageCode(
     "MultipleVarianceModifiers",
     index: 97,
-    message: r"""Each type parameter can have at most one variance modifier.""",
-    tip: r"""Use at most one of the 'in', 'out', or 'inout' modifiers.""");
+    problemMessage:
+        r"""Each type parameter can have at most one variance modifier.""",
+    correctionMessage:
+        r"""Use at most one of the 'in', 'out', or 'inout' modifiers.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMultipleWith = messageMultipleWith;
@@ -7133,13 +7282,15 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageMultipleWith = const MessageCode("MultipleWith",
     index: 24,
-    message: r"""Each class definition can have at most one with clause.""",
-    tip: r"""Try combining all of the with clauses into a single clause.""");
+    problemMessage:
+        r"""Each class definition can have at most one with clause.""",
+    correctionMessage:
+        r"""Try combining all of the with clauses into a single clause.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateNameNotFound =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Undefined name '#name'.""",
+        problemMessageTemplate: r"""Undefined name '#name'.""",
         withArguments: _withArgumentsNameNotFound);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7152,7 +7303,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeNameNotFound,
-      message: """Undefined name '${name}'.""", arguments: {'name': name});
+      problemMessage: """Undefined name '${name}'.""",
+      arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7162,7 +7314,7 @@
 const MessageCode messageNamedFunctionExpression = const MessageCode(
     "NamedFunctionExpression",
     analyzerCodes: <String>["NAMED_FUNCTION_EXPRESSION"],
-    message: r"""A function expression can't have a name.""");
+    problemMessage: r"""A function expression can't have a name.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -7171,7 +7323,7 @@
         String
             name2)> templateNamedMixinOverride = const Template<
         Message Function(String name, String name2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The mixin application class '#name' introduces an erroneous override of '#name2'.""",
     withArguments: _withArgumentsNamedMixinOverride);
 
@@ -7188,7 +7340,7 @@
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   return new Message(codeNamedMixinOverride,
-      message:
+      problemMessage:
           """The mixin application class '${name}' introduces an erroneous override of '${name2}'.""",
       arguments: {'name': name, 'name2': name2});
 }
@@ -7201,8 +7353,8 @@
 const MessageCode messageNativeClauseShouldBeAnnotation = const MessageCode(
     "NativeClauseShouldBeAnnotation",
     index: 23,
-    message: r"""Native clause in this form is deprecated.""",
-    tip:
+    problemMessage: r"""Native clause in this form is deprecated.""",
+    correctionMessage:
         r"""Try removing this native clause and adding @native() or @native('native-name') before the declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7212,7 +7364,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNeverReachableSwitchDefaultError = const MessageCode(
     "NeverReachableSwitchDefaultError",
-    message:
+    problemMessage:
         r"""`null` encountered as case in a switch expression with a non-nullable enum type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7223,7 +7375,7 @@
 const MessageCode messageNeverReachableSwitchDefaultWarning = const MessageCode(
     "NeverReachableSwitchDefaultWarning",
     severity: Severity.warning,
-    message:
+    problemMessage:
         r"""The default case is not reachable with sound null safety because the switch expression is non-nullable.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7231,7 +7383,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNeverValueError = const MessageCode("NeverValueError",
-    message:
+    problemMessage:
         r"""`null` encountered as the result from expression with type `Never`.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7241,15 +7393,15 @@
 const MessageCode messageNeverValueWarning = const MessageCode(
     "NeverValueWarning",
     severity: Severity.warning,
-    message:
+    problemMessage:
         r"""The expression can not result in a value with sound null safety because the expression type is `Never`.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(Token token)> templateNoFormals = const Template<
         Message Function(Token token)>(
-    messageTemplate: r"""A function should have formal parameters.""",
-    tipTemplate:
+    problemMessageTemplate: r"""A function should have formal parameters.""",
+    correctionMessageTemplate:
         r"""Try adding '()' after '#lexeme', or add 'get' before '#lexeme' to declare a getter.""",
     withArguments: _withArgumentsNoFormals);
 
@@ -7262,8 +7414,8 @@
 Message _withArgumentsNoFormals(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeNoFormals,
-      message: """A function should have formal parameters.""",
-      tip:
+      problemMessage: """A function should have formal parameters.""",
+      correctionMessage:
           """Try adding '()' after '${lexeme}', or add 'get' before '${lexeme}' to declare a getter.""",
       arguments: {'lexeme': token});
 }
@@ -7271,7 +7423,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateNoSuchNamedParameter =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""No named parameter with the name '#name'.""",
+        problemMessageTemplate:
+            r"""No named parameter with the name '#name'.""",
         withArguments: _withArgumentsNoSuchNamedParameter);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7284,7 +7437,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeNoSuchNamedParameter,
-      message: """No named parameter with the name '${name}'.""",
+      problemMessage: """No named parameter with the name '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -7295,7 +7448,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNoUnnamedConstructorInObject = const MessageCode(
     "NoUnnamedConstructorInObject",
-    message: r"""'Object' has no unnamed constructor.""");
+    problemMessage: r"""'Object' has no unnamed constructor.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeNonAgnosticConstant = messageNonAgnosticConstant;
@@ -7303,7 +7456,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNonAgnosticConstant = const MessageCode(
     "NonAgnosticConstant",
-    message: r"""Constant value is not strong/weak mode agnostic.""");
+    problemMessage: r"""Constant value is not strong/weak mode agnostic.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -7312,9 +7465,9 @@
         int
             codePoint)> templateNonAsciiIdentifier = const Template<
         Message Function(String character, int codePoint)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The non-ASCII character '#character' (#unicode) can't be used in identifiers, only in strings and comments.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).""",
     withArguments: _withArgumentsNonAsciiIdentifier);
 
@@ -7331,9 +7484,9 @@
   String unicode =
       "U+${codePoint.toRadixString(16).toUpperCase().padLeft(4, '0')}";
   return new Message(codeNonAsciiIdentifier,
-      message:
+      problemMessage:
           """The non-ASCII character '${character}' (${unicode}) can't be used in identifiers, only in strings and comments.""",
-      tip: """Try using an US-ASCII letter, a digit, '_' (an underscore), or '\$' (a dollar sign).""",
+      correctionMessage: """Try using an US-ASCII letter, a digit, '_' (an underscore), or '\$' (a dollar sign).""",
       arguments: {'character': character, 'unicode': codePoint});
 }
 
@@ -7343,7 +7496,7 @@
         int
             codePoint)> templateNonAsciiWhitespace = const Template<
         Message Function(int codePoint)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The non-ASCII space character #unicode can only be used in strings and comments.""",
     withArguments: _withArgumentsNonAsciiWhitespace);
 
@@ -7357,7 +7510,7 @@
   String unicode =
       "U+${codePoint.toRadixString(16).toUpperCase().padLeft(4, '0')}";
   return new Message(codeNonAsciiWhitespace,
-      message:
+      problemMessage:
           """The non-ASCII space character ${unicode} can only be used in strings and comments.""",
       arguments: {'unicode': codePoint});
 }
@@ -7369,9 +7522,10 @@
 const MessageCode messageNonConstConstructor = const MessageCode(
     "NonConstConstructor",
     analyzerCodes: <String>["NOT_CONSTANT_EXPRESSION"],
-    message:
+    problemMessage:
         r"""Cannot invoke a non-'const' constructor where a const expression is expected.""",
-    tip: r"""Try using a constructor or factory that is 'const'.""");
+    correctionMessage:
+        r"""Try using a constructor or factory that is 'const'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeNonConstFactory = messageNonConstFactory;
@@ -7379,9 +7533,10 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNonConstFactory = const MessageCode("NonConstFactory",
     analyzerCodes: <String>["NOT_CONSTANT_EXPRESSION"],
-    message:
+    problemMessage:
         r"""Cannot invoke a non-'const' factory where a const expression is expected.""",
-    tip: r"""Try using a constructor or factory that is 'const'.""");
+    correctionMessage:
+        r"""Try using a constructor or factory that is 'const'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeNonInstanceTypeVariableUse =
@@ -7391,7 +7546,7 @@
 const MessageCode messageNonInstanceTypeVariableUse = const MessageCode(
     "NonInstanceTypeVariableUse",
     analyzerCodes: <String>["TYPE_PARAMETER_REFERENCED_BY_STATIC"],
-    message: r"""Can only use type variables in instance methods.""");
+    problemMessage: r"""Can only use type variables in instance methods.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -7399,7 +7554,7 @@
         String
             name)> templateNonNullableNotAssignedError = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Non-nullable variable '#name' must be assigned before it can be used.""",
     withArguments: _withArgumentsNonNullableNotAssignedError);
 
@@ -7414,7 +7569,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeNonNullableNotAssignedError,
-      message:
+      problemMessage:
           """Non-nullable variable '${name}' must be assigned before it can be used.""",
       arguments: {'name': name});
 }
@@ -7426,7 +7581,7 @@
 const MessageCode messageNonNullableOptOutComment = const MessageCode(
     "NonNullableOptOutComment",
     severity: Severity.context,
-    message:
+    problemMessage:
         r"""This is the annotation that opts out this library from null safety features.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7435,8 +7590,9 @@
         String
             string)> templateNonNullableOptOutExplicit = const Template<
         Message Function(String string)>(
-    messageTemplate: r"""Null safety features are disabled for this library.""",
-    tipTemplate:
+    problemMessageTemplate:
+        r"""Null safety features are disabled for this library.""",
+    correctionMessageTemplate:
         r"""Try removing the `@dart=` annotation or setting the language version to #string or higher.""",
     withArguments: _withArgumentsNonNullableOptOutExplicit);
 
@@ -7450,8 +7606,8 @@
 Message _withArgumentsNonNullableOptOutExplicit(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeNonNullableOptOutExplicit,
-      message: """Null safety features are disabled for this library.""",
-      tip:
+      problemMessage: """Null safety features are disabled for this library.""",
+      correctionMessage:
           """Try removing the `@dart=` annotation or setting the language version to ${string} or higher.""",
       arguments: {'string': string});
 }
@@ -7462,8 +7618,9 @@
         String
             string)> templateNonNullableOptOutImplicit = const Template<
         Message Function(String string)>(
-    messageTemplate: r"""Null safety features are disabled for this library.""",
-    tipTemplate:
+    problemMessageTemplate:
+        r"""Null safety features are disabled for this library.""",
+    correctionMessageTemplate:
         r"""Try removing the package language version or setting the language version to #string or higher.""",
     withArguments: _withArgumentsNonNullableOptOutImplicit);
 
@@ -7477,8 +7634,8 @@
 Message _withArgumentsNonNullableOptOutImplicit(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeNonNullableOptOutImplicit,
-      message: """Null safety features are disabled for this library.""",
-      tip:
+      problemMessage: """Null safety features are disabled for this library.""",
+      correctionMessage:
           """Try removing the package language version or setting the language version to ${string} or higher.""",
       arguments: {'string': string});
 }
@@ -7490,8 +7647,9 @@
 const MessageCode messageNonPartOfDirectiveInPart = const MessageCode(
     "NonPartOfDirectiveInPart",
     analyzerCodes: <String>["NON_PART_OF_DIRECTIVE_IN_PART"],
-    message: r"""The part-of directive must be the only directive in a part.""",
-    tip:
+    problemMessage:
+        r"""The part-of directive must be the only directive in a part.""",
+    correctionMessage:
         r"""Try removing the other directives, or moving them to the library for which this is a part.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7501,13 +7659,13 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNonPositiveArrayDimensions = const MessageCode(
     "NonPositiveArrayDimensions",
-    message: r"""Array dimensions must be positive numbers.""");
+    problemMessage: r"""Array dimensions must be positive numbers.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateNonSimpleBoundViaReference =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Bound of this variable references raw type '#name'.""",
         withArguments: _withArgumentsNonSimpleBoundViaReference);
 
@@ -7521,7 +7679,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeNonSimpleBoundViaReference,
-      message: """Bound of this variable references raw type '${name}'.""",
+      problemMessage:
+          """Bound of this variable references raw type '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -7531,7 +7690,7 @@
         String
             name)> templateNonSimpleBoundViaVariable = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Bound of this variable references variable '#name' from the same declaration.""",
     withArguments: _withArgumentsNonSimpleBoundViaVariable);
 
@@ -7545,7 +7704,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeNonSimpleBoundViaVariable,
-      message:
+      problemMessage:
           """Bound of this variable references variable '${name}' from the same declaration.""",
       arguments: {'name': name});
 }
@@ -7557,8 +7716,8 @@
 const MessageCode messageNonVoidReturnOperator = const MessageCode(
     "NonVoidReturnOperator",
     analyzerCodes: <String>["NON_VOID_RETURN_FOR_OPERATOR"],
-    message: r"""The return type of the operator []= must be 'void'.""",
-    tip: r"""Try changing the return type to 'void'.""");
+    problemMessage: r"""The return type of the operator []= must be 'void'.""",
+    correctionMessage: r"""Try changing the return type to 'void'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeNonVoidReturnSetter = messageNonVoidReturnSetter;
@@ -7567,8 +7726,9 @@
 const MessageCode messageNonVoidReturnSetter = const MessageCode(
     "NonVoidReturnSetter",
     analyzerCodes: <String>["NON_VOID_RETURN_FOR_SETTER"],
-    message: r"""The return type of the setter must be 'void' or absent.""",
-    tip:
+    problemMessage:
+        r"""The return type of the setter must be 'void' or absent.""",
+    correctionMessage:
         r"""Try removing the return type, or define a method rather than a setter.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7578,7 +7738,7 @@
 const MessageCode messageNotAConstantExpression = const MessageCode(
     "NotAConstantExpression",
     analyzerCodes: <String>["NOT_CONSTANT_EXPRESSION"],
-    message: r"""Not a constant expression.""");
+    problemMessage: r"""Not a constant expression.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -7587,7 +7747,7 @@
         String
             name2)> templateNotAPrefixInTypeAnnotation = const Template<
         Message Function(String name, String name2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""'#name.#name2' can't be used as a type because '#name' doesn't refer to an import prefix.""",
     withArguments: _withArgumentsNotAPrefixInTypeAnnotation);
 
@@ -7605,7 +7765,7 @@
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   return new Message(codeNotAPrefixInTypeAnnotation,
-      message:
+      problemMessage:
           """'${name}.${name2}' can't be used as a type because '${name}' doesn't refer to an import prefix.""",
       arguments: {'name': name, 'name2': name2});
 }
@@ -7613,7 +7773,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateNotAType =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""'#name' isn't a type.""",
+        problemMessageTemplate: r"""'#name' isn't a type.""",
         withArguments: _withArgumentsNotAType);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7626,7 +7786,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeNotAType,
-      message: """'${name}' isn't a type.""", arguments: {'name': name});
+      problemMessage: """'${name}' isn't a type.""", arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7634,7 +7794,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNotATypeContext = const MessageCode("NotATypeContext",
-    severity: Severity.context, message: r"""This isn't a type.""");
+    severity: Severity.context, problemMessage: r"""This isn't a type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeNotAnLvalue = messageNotAnLvalue;
@@ -7642,12 +7802,12 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNotAnLvalue = const MessageCode("NotAnLvalue",
     analyzerCodes: <String>["NOT_AN_LVALUE"],
-    message: r"""Can't assign to this.""");
+    problemMessage: r"""Can't assign to this.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateNotBinaryOperator =
     const Template<Message Function(Token token)>(
-        messageTemplate: r"""'#lexeme' isn't a binary operator.""",
+        problemMessageTemplate: r"""'#lexeme' isn't a binary operator.""",
         withArguments: _withArgumentsNotBinaryOperator);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7660,14 +7820,14 @@
 Message _withArgumentsNotBinaryOperator(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeNotBinaryOperator,
-      message: """'${lexeme}' isn't a binary operator.""",
+      problemMessage: """'${lexeme}' isn't a binary operator.""",
       arguments: {'lexeme': token});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string)> templateNotConstantExpression =
     const Template<Message Function(String string)>(
-        messageTemplate: r"""#string is not a constant expression.""",
+        problemMessageTemplate: r"""#string is not a constant expression.""",
         withArguments: _withArgumentsNotConstantExpression);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7679,7 +7839,7 @@
 Message _withArgumentsNotConstantExpression(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeNotConstantExpression,
-      message: """${string} is not a constant expression.""",
+      problemMessage: """${string} is not a constant expression.""",
       arguments: {'string': string});
 }
 
@@ -7691,15 +7851,15 @@
 const MessageCode messageNullAwareCascadeOutOfOrder = const MessageCode(
     "NullAwareCascadeOutOfOrder",
     index: 96,
-    message:
+    problemMessage:
         r"""The '?..' cascade operator must be first in the cascade sequence.""",
-    tip:
+    correctionMessage:
         r"""Try moving the '?..' operator to be the first cascade operator in the sequence.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateNullableInterfaceError =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't implement '#name' because it's marked with '?'.""",
         withArguments: _withArgumentsNullableInterfaceError);
 
@@ -7714,14 +7874,15 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeNullableInterfaceError,
-      message: """Can't implement '${name}' because it's marked with '?'.""",
+      problemMessage:
+          """Can't implement '${name}' because it's marked with '?'.""",
       arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateNullableMixinError =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't mix '#name' in because it's marked with '?'.""",
         withArguments: _withArgumentsNullableMixinError);
 
@@ -7736,7 +7897,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeNullableMixinError,
-      message: """Can't mix '${name}' in because it's marked with '?'.""",
+      problemMessage:
+          """Can't mix '${name}' in because it's marked with '?'.""",
       arguments: {'name': name});
 }
 
@@ -7746,13 +7908,13 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageNullableSpreadError = const MessageCode(
     "NullableSpreadError",
-    message:
+    problemMessage:
         r"""An expression whose value can be 'null' must be null-checked before it can be dereferenced.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateNullableSuperclassError =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't extend '#name' because it's marked with '?'.""",
         withArguments: _withArgumentsNullableSuperclassError);
 
@@ -7767,14 +7929,15 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeNullableSuperclassError,
-      message: """Can't extend '${name}' because it's marked with '?'.""",
+      problemMessage:
+          """Can't extend '${name}' because it's marked with '?'.""",
       arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateNullableTearoffError =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't tear off method '#name' from a potentially null value.""",
         withArguments: _withArgumentsNullableTearoffError);
 
@@ -7789,7 +7952,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeNullableTearoffError,
-      message:
+      problemMessage:
           """Can't tear off method '${name}' from a potentially null value.""",
       arguments: {'name': name});
 }
@@ -7799,7 +7962,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageObjectExtends = const MessageCode("ObjectExtends",
-    message: r"""The class 'Object' can't have a superclass.""");
+    problemMessage: r"""The class 'Object' can't have a superclass.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeObjectImplements = messageObjectImplements;
@@ -7807,14 +7970,14 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageObjectImplements = const MessageCode(
     "ObjectImplements",
-    message: r"""The class 'Object' can't implement anything.""");
+    problemMessage: r"""The class 'Object' can't implement anything.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeObjectMixesIn = messageObjectMixesIn;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageObjectMixesIn = const MessageCode("ObjectMixesIn",
-    message: r"""The class 'Object' can't use mixins.""");
+    problemMessage: r"""The class 'Object' can't use mixins.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeOnlyTry = messageOnlyTry;
@@ -7822,9 +7985,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageOnlyTry = const MessageCode("OnlyTry",
     index: 20,
-    message:
+    problemMessage:
         r"""A try block must be followed by an 'on', 'catch', or 'finally' clause.""",
-    tip:
+    correctionMessage:
         r"""Try adding either a catch or finally clause, or remove the try statement.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7833,8 +7996,9 @@
         String
             name)> templateOperatorMinusParameterMismatch = const Template<
         Message Function(String name)>(
-    messageTemplate: r"""Operator '#name' should have zero or one parameter.""",
-    tipTemplate:
+    problemMessageTemplate:
+        r"""Operator '#name' should have zero or one parameter.""",
+    correctionMessageTemplate:
         r"""With zero parameters, it has the syntactic form '-a', formally known as 'unary-'. With one parameter, it has the syntactic form 'a - b', formally known as '-'.""",
     withArguments: _withArgumentsOperatorMinusParameterMismatch);
 
@@ -7850,8 +8014,9 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeOperatorMinusParameterMismatch,
-      message: """Operator '${name}' should have zero or one parameter.""",
-      tip:
+      problemMessage:
+          """Operator '${name}' should have zero or one parameter.""",
+      correctionMessage:
           """With zero parameters, it has the syntactic form '-a', formally known as 'unary-'. With one parameter, it has the syntactic form 'a - b', formally known as '-'.""",
       arguments: {'name': name});
 }
@@ -7860,7 +8025,8 @@
 const Template<Message Function(String name)>
     templateOperatorParameterMismatch0 =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Operator '#name' shouldn't have any parameters.""",
+        problemMessageTemplate:
+            r"""Operator '#name' shouldn't have any parameters.""",
         withArguments: _withArgumentsOperatorParameterMismatch0);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7874,7 +8040,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeOperatorParameterMismatch0,
-      message: """Operator '${name}' shouldn't have any parameters.""",
+      problemMessage: """Operator '${name}' shouldn't have any parameters.""",
       arguments: {'name': name});
 }
 
@@ -7882,7 +8048,7 @@
 const Template<Message Function(String name)>
     templateOperatorParameterMismatch1 =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Operator '#name' should have exactly one parameter.""",
         withArguments: _withArgumentsOperatorParameterMismatch1);
 
@@ -7896,7 +8062,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeOperatorParameterMismatch1,
-      message: """Operator '${name}' should have exactly one parameter.""",
+      problemMessage:
+          """Operator '${name}' should have exactly one parameter.""",
       arguments: {'name': name});
 }
 
@@ -7904,7 +8071,7 @@
 const Template<Message Function(String name)>
     templateOperatorParameterMismatch2 =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Operator '#name' should have exactly two parameters.""",
         withArguments: _withArgumentsOperatorParameterMismatch2);
 
@@ -7918,7 +8085,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeOperatorParameterMismatch2,
-      message: """Operator '${name}' should have exactly two parameters.""",
+      problemMessage:
+          """Operator '${name}' should have exactly two parameters.""",
       arguments: {'name': name});
 }
 
@@ -7929,7 +8097,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageOperatorWithOptionalFormals = const MessageCode(
     "OperatorWithOptionalFormals",
-    message: r"""An operator can't have optional parameters.""");
+    problemMessage: r"""An operator can't have optional parameters.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeOperatorWithTypeParameters =
@@ -7939,13 +8107,14 @@
 const MessageCode messageOperatorWithTypeParameters = const MessageCode(
     "OperatorWithTypeParameters",
     analyzerCodes: <String>["TYPE_PARAMETER_ON_OPERATOR"],
-    message: r"""Types parameters aren't allowed when defining an operator.""",
-    tip: r"""Try removing the type parameters.""");
+    problemMessage:
+        r"""Types parameters aren't allowed when defining an operator.""",
+    correctionMessage: r"""Try removing the type parameters.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateOverriddenMethodCause =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""This is the overridden method ('#name').""",
+        problemMessageTemplate: r"""This is the overridden method ('#name').""",
         withArguments: _withArgumentsOverriddenMethodCause);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7958,7 +8127,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeOverriddenMethodCause,
-      message: """This is the overridden method ('${name}').""",
+      problemMessage: """This is the overridden method ('${name}').""",
       arguments: {'name': name});
 }
 
@@ -7969,7 +8138,7 @@
         String
             name2)> templateOverrideFewerNamedArguments = const Template<
         Message Function(String name, String name2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The method '#name' has fewer named arguments than those of overridden method '#name2'.""",
     withArguments: _withArgumentsOverrideFewerNamedArguments);
 
@@ -7987,7 +8156,7 @@
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   return new Message(codeOverrideFewerNamedArguments,
-      message:
+      problemMessage:
           """The method '${name}' has fewer named arguments than those of overridden method '${name2}'.""",
       arguments: {'name': name, 'name2': name2});
 }
@@ -7999,7 +8168,7 @@
         String
             name2)> templateOverrideFewerPositionalArguments = const Template<
         Message Function(String name, String name2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The method '#name' has fewer positional arguments than those of overridden method '#name2'.""",
     withArguments: _withArgumentsOverrideFewerPositionalArguments);
 
@@ -8018,7 +8187,7 @@
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   return new Message(codeOverrideFewerPositionalArguments,
-      message:
+      problemMessage:
           """The method '${name}' has fewer positional arguments than those of overridden method '${name2}'.""",
       arguments: {'name': name, 'name2': name2});
 }
@@ -8031,7 +8200,7 @@
         String
             name3)> templateOverrideMismatchNamedParameter = const Template<
         Message Function(String name, String name2, String name3)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The method '#name' doesn't have the named parameter '#name2' of overridden method '#name3'.""",
     withArguments: _withArgumentsOverrideMismatchNamedParameter);
 
@@ -8052,7 +8221,7 @@
   if (name3.isEmpty) throw 'No name provided';
   name3 = demangleMixinApplicationName(name3);
   return new Message(codeOverrideMismatchNamedParameter,
-      message:
+      problemMessage:
           """The method '${name}' doesn't have the named parameter '${name2}' of overridden method '${name3}'.""",
       arguments: {'name': name, 'name2': name2, 'name3': name3});
 }
@@ -8061,7 +8230,7 @@
 const Template<Message Function(String name, String name2, String name3)>
     templateOverrideMismatchRequiredNamedParameter =
     const Template<Message Function(String name, String name2, String name3)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The required named parameter '#name' in method '#name2' is not required in overridden method '#name3'.""",
         withArguments: _withArgumentsOverrideMismatchRequiredNamedParameter);
 
@@ -8082,7 +8251,7 @@
   if (name3.isEmpty) throw 'No name provided';
   name3 = demangleMixinApplicationName(name3);
   return new Message(codeOverrideMismatchRequiredNamedParameter,
-      message:
+      problemMessage:
           """The required named parameter '${name}' in method '${name2}' is not required in overridden method '${name3}'.""",
       arguments: {'name': name, 'name2': name2, 'name3': name3});
 }
@@ -8094,7 +8263,7 @@
         String
             name2)> templateOverrideMoreRequiredArguments = const Template<
         Message Function(String name, String name2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The method '#name' has more required arguments than those of overridden method '#name2'.""",
     withArguments: _withArgumentsOverrideMoreRequiredArguments);
 
@@ -8112,7 +8281,7 @@
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   return new Message(codeOverrideMoreRequiredArguments,
-      message:
+      problemMessage:
           """The method '${name}' has more required arguments than those of overridden method '${name2}'.""",
       arguments: {'name': name, 'name2': name2});
 }
@@ -8124,7 +8293,7 @@
         String
             name2)> templateOverrideTypeVariablesMismatch = const Template<
         Message Function(String name, String name2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Declared type variables of '#name' doesn't match those on overridden method '#name2'.""",
     withArguments: _withArgumentsOverrideTypeVariablesMismatch);
 
@@ -8142,7 +8311,7 @@
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   return new Message(codeOverrideTypeVariablesMismatch,
-      message:
+      problemMessage:
           """Declared type variables of '${name}' doesn't match those on overridden method '${name2}'.""",
       arguments: {'name': name, 'name2': name2});
 }
@@ -8151,7 +8320,8 @@
 const Template<Message Function(String name, Uri uri_)>
     templatePackageNotFound =
     const Template<Message Function(String name, Uri uri_)>(
-        messageTemplate: r"""Couldn't resolve the package '#name' in '#uri'.""",
+        problemMessageTemplate:
+            r"""Couldn't resolve the package '#name' in '#uri'.""",
         withArguments: _withArgumentsPackageNotFound);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8166,14 +8336,15 @@
   name = demangleMixinApplicationName(name);
   String? uri = relativizeUri(uri_);
   return new Message(codePackageNotFound,
-      message: """Couldn't resolve the package '${name}' in '${uri}'.""",
+      problemMessage: """Couldn't resolve the package '${name}' in '${uri}'.""",
       arguments: {'name': name, 'uri': uri_});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string)> templatePackagesFileFormat =
     const Template<Message Function(String string)>(
-        messageTemplate: r"""Problem in packages configuration file: #string""",
+        problemMessageTemplate:
+            r"""Problem in packages configuration file: #string""",
         withArguments: _withArgumentsPackagesFileFormat);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8186,7 +8357,7 @@
 Message _withArgumentsPackagesFileFormat(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codePackagesFileFormat,
-      message: """Problem in packages configuration file: ${string}""",
+      problemMessage: """Problem in packages configuration file: ${string}""",
       arguments: {'string': string});
 }
 
@@ -8196,7 +8367,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messagePartExport = const MessageCode("PartExport",
     analyzerCodes: <String>["EXPORT_OF_NON_LIBRARY"],
-    message:
+    problemMessage:
         r"""Can't export this file because it contains a 'part of' declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8206,7 +8377,7 @@
 const MessageCode messagePartExportContext = const MessageCode(
     "PartExportContext",
     severity: Severity.context,
-    message: r"""This is the file that can't be exported.""");
+    problemMessage: r"""This is the file that can't be exported.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codePartInPart = messagePartInPart;
@@ -8214,8 +8385,10 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messagePartInPart = const MessageCode("PartInPart",
     analyzerCodes: <String>["NON_PART_OF_DIRECTIVE_IN_PART"],
-    message: r"""A file that's a part of a library can't have parts itself.""",
-    tip: r"""Try moving the 'part' declaration to the containing library.""");
+    problemMessage:
+        r"""A file that's a part of a library can't have parts itself.""",
+    correctionMessage:
+        r"""Try moving the 'part' declaration to the containing library.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codePartInPartLibraryContext = messagePartInPartLibraryContext;
@@ -8224,15 +8397,15 @@
 const MessageCode messagePartInPartLibraryContext = const MessageCode(
     "PartInPartLibraryContext",
     severity: Severity.context,
-    message: r"""This is the containing library.""");
+    problemMessage: r"""This is the containing library.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(Uri uri_)> templatePartOfInLibrary = const Template<
         Message Function(Uri uri_)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Can't import '#uri', because it has a 'part of' declaration.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try removing the 'part of' declaration, or using '#uri' as a part.""",
     withArguments: _withArgumentsPartOfInLibrary);
 
@@ -8245,9 +8418,9 @@
 Message _withArgumentsPartOfInLibrary(Uri uri_) {
   String? uri = relativizeUri(uri_);
   return new Message(codePartOfInLibrary,
-      message:
+      problemMessage:
           """Can't import '${uri}', because it has a 'part of' declaration.""",
-      tip:
+      correctionMessage:
           """Try removing the 'part of' declaration, or using '${uri}' as a part.""",
       arguments: {'uri': uri_});
 }
@@ -8260,7 +8433,7 @@
         String
             name2)> templatePartOfLibraryNameMismatch = const Template<
         Message Function(Uri uri_, String name, String name2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Using '#uri' as part of '#name' but its 'part of' declaration says '#name2'.""",
     withArguments: _withArgumentsPartOfLibraryNameMismatch);
 
@@ -8280,7 +8453,7 @@
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   return new Message(codePartOfLibraryNameMismatch,
-      message:
+      problemMessage:
           """Using '${uri}' as part of '${name}' but its 'part of' declaration says '${name2}'.""",
       arguments: {'uri': uri_, 'name': name, 'name2': name2});
 }
@@ -8291,7 +8464,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messagePartOfSelf = const MessageCode("PartOfSelf",
     analyzerCodes: <String>["PART_OF_NON_PART"],
-    message: r"""A file can't be a part of itself.""");
+    problemMessage: r"""A file can't be a part of itself.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codePartOfTwice = messagePartOfTwice;
@@ -8299,8 +8472,10 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messagePartOfTwice = const MessageCode("PartOfTwice",
     index: 25,
-    message: r"""Only one part-of directive may be declared in a file.""",
-    tip: r"""Try removing all but one of the part-of directives.""");
+    problemMessage:
+        r"""Only one part-of directive may be declared in a file.""",
+    correctionMessage:
+        r"""Try removing all but one of the part-of directives.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codePartOfTwoLibraries = messagePartOfTwoLibraries;
@@ -8309,8 +8484,8 @@
 const MessageCode messagePartOfTwoLibraries = const MessageCode(
     "PartOfTwoLibraries",
     analyzerCodes: <String>["PART_OF_DIFFERENT_LIBRARY"],
-    message: r"""A file can't be part of more than one library.""",
-    tip:
+    problemMessage: r"""A file can't be part of more than one library.""",
+    correctionMessage:
         r"""Try moving the shared declarations into the libraries, or into a new library.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8321,7 +8496,7 @@
 const MessageCode messagePartOfTwoLibrariesContext = const MessageCode(
     "PartOfTwoLibrariesContext",
     severity: Severity.context,
-    message: r"""Used as a part in this library.""");
+    problemMessage: r"""Used as a part in this library.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -8331,7 +8506,7 @@
         Uri
             uri3_)> templatePartOfUriMismatch = const Template<
         Message Function(Uri uri_, Uri uri2_, Uri uri3_)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Using '#uri' as part of '#uri2' but its 'part of' declaration says '#uri3'.""",
     withArguments: _withArgumentsPartOfUriMismatch);
 
@@ -8348,7 +8523,7 @@
   String? uri2 = relativizeUri(uri2_);
   String? uri3 = relativizeUri(uri3_);
   return new Message(codePartOfUriMismatch,
-      message:
+      problemMessage:
           """Using '${uri}' as part of '${uri2}' but its 'part of' declaration says '${uri3}'.""",
       arguments: {'uri': uri_, 'uri2': uri2_, 'uri3': uri3_});
 }
@@ -8361,9 +8536,9 @@
         String
             name)> templatePartOfUseUri = const Template<
         Message Function(Uri uri_, Uri uri2_, String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Using '#uri' as part of '#uri2' but its 'part of' declaration says '#name'.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try changing the 'part of' declaration to use a relative file name.""",
     withArguments: _withArgumentsPartOfUseUri);
 
@@ -8381,9 +8556,9 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codePartOfUseUri,
-      message:
+      problemMessage:
           """Using '${uri}' as part of '${uri2}' but its 'part of' declaration says '${name}'.""",
-      tip: """Try changing the 'part of' declaration to use a relative file name.""",
+      correctionMessage: """Try changing the 'part of' declaration to use a relative file name.""",
       arguments: {'uri': uri_, 'uri2': uri2_, 'name': name});
 }
 
@@ -8392,13 +8567,14 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messagePartOrphan = const MessageCode("PartOrphan",
-    message: r"""This part doesn't have a containing library.""",
-    tip: r"""Try removing the 'part of' declaration.""");
+    problemMessage: r"""This part doesn't have a containing library.""",
+    correctionMessage: r"""Try removing the 'part of' declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Uri uri_)> templatePartTwice =
     const Template<Message Function(Uri uri_)>(
-        messageTemplate: r"""Can't use '#uri' as a part more than once.""",
+        problemMessageTemplate:
+            r"""Can't use '#uri' as a part more than once.""",
         withArguments: _withArgumentsPartTwice);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8410,7 +8586,7 @@
 Message _withArgumentsPartTwice(Uri uri_) {
   String? uri = relativizeUri(uri_);
   return new Message(codePartTwice,
-      message: """Can't use '${uri}' as a part more than once.""",
+      problemMessage: """Can't use '${uri}' as a part more than once.""",
       arguments: {'uri': uri_});
 }
 
@@ -8421,7 +8597,7 @@
 const MessageCode messagePatchClassOrigin = const MessageCode(
     "PatchClassOrigin",
     severity: Severity.context,
-    message: r"""This is the origin class.""");
+    problemMessage: r"""This is the origin class.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codePatchClassTypeVariablesMismatch =
@@ -8430,7 +8606,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messagePatchClassTypeVariablesMismatch = const MessageCode(
     "PatchClassTypeVariablesMismatch",
-    message:
+    problemMessage:
         r"""A patch class must have the same number of type variables as its origin class.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8439,7 +8615,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messagePatchDeclarationMismatch = const MessageCode(
     "PatchDeclarationMismatch",
-    message: r"""This patch doesn't match origin declaration.""");
+    problemMessage: r"""This patch doesn't match origin declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codePatchDeclarationOrigin = messagePatchDeclarationOrigin;
@@ -8448,14 +8624,14 @@
 const MessageCode messagePatchDeclarationOrigin = const MessageCode(
     "PatchDeclarationOrigin",
     severity: Severity.context,
-    message: r"""This is the origin declaration.""");
+    problemMessage: r"""This is the origin declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name, Uri uri_)>
     templatePatchInjectionFailed =
     const Template<Message Function(String name, Uri uri_)>(
-        messageTemplate: r"""Can't inject '#name' into '#uri'.""",
-        tipTemplate: r"""Try adding '@patch'.""",
+        problemMessageTemplate: r"""Can't inject '#name' into '#uri'.""",
+        correctionMessageTemplate: r"""Try adding '@patch'.""",
         withArguments: _withArgumentsPatchInjectionFailed);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8470,8 +8646,8 @@
   name = demangleMixinApplicationName(name);
   String? uri = relativizeUri(uri_);
   return new Message(codePatchInjectionFailed,
-      message: """Can't inject '${name}' into '${uri}'.""",
-      tip: """Try adding '@patch'.""",
+      problemMessage: """Can't inject '${name}' into '${uri}'.""",
+      correctionMessage: """Try adding '@patch'.""",
       arguments: {'name': name, 'uri': uri_});
 }
 
@@ -8481,9 +8657,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messagePatchNonExternal = const MessageCode(
     "PatchNonExternal",
-    message:
+    problemMessage:
         r"""Can't apply this patch as its origin declaration isn't external.""",
-    tip: r"""Try adding 'external' to the origin declaration.""");
+    correctionMessage: r"""Try adding 'external' to the origin declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codePlatformPrivateLibraryAccess =
@@ -8493,7 +8669,7 @@
 const MessageCode messagePlatformPrivateLibraryAccess = const MessageCode(
     "PlatformPrivateLibraryAccess",
     analyzerCodes: <String>["IMPORT_INTERNAL_LIBRARY"],
-    message: r"""Can't access platform private library.""");
+    problemMessage: r"""Can't access platform private library.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codePositionalAfterNamedArgument =
@@ -8503,8 +8679,8 @@
 const MessageCode messagePositionalAfterNamedArgument = const MessageCode(
     "PositionalAfterNamedArgument",
     analyzerCodes: <String>["POSITIONAL_AFTER_NAMED_ARGUMENT"],
-    message: r"""Place positional arguments before named arguments.""",
-    tip:
+    problemMessage: r"""Place positional arguments before named arguments.""",
+    correctionMessage:
         r"""Try moving the positional argument before the named arguments, or add a name to the argument.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8515,9 +8691,9 @@
 const MessageCode messagePositionalParameterWithEquals = const MessageCode(
     "PositionalParameterWithEquals",
     analyzerCodes: <String>["WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER"],
-    message:
+    problemMessage:
         r"""Positional optional parameters can't use ':' to specify a default value.""",
-    tip: r"""Try replacing ':' with '='.""");
+    correctionMessage: r"""Try replacing ':' with '='.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codePrefixAfterCombinator = messagePrefixAfterCombinator;
@@ -8526,9 +8702,9 @@
 const MessageCode messagePrefixAfterCombinator = const MessageCode(
     "PrefixAfterCombinator",
     index: 6,
-    message:
+    problemMessage:
         r"""The prefix ('as' clause) should come before any show/hide combinators.""",
-    tip: r"""Try moving the prefix before the combinators.""");
+    correctionMessage: r"""Try moving the prefix before the combinators.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codePrivateNamedParameter = messagePrivateNamedParameter;
@@ -8537,7 +8713,7 @@
 const MessageCode messagePrivateNamedParameter = const MessageCode(
     "PrivateNamedParameter",
     analyzerCodes: <String>["PRIVATE_OPTIONAL_PARAMETER"],
-    message: r"""An optional named parameter can't start with '_'.""");
+    problemMessage: r"""An optional named parameter can't start with '_'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeRedirectingConstructorWithAnotherInitializer =
@@ -8547,7 +8723,7 @@
 const MessageCode messageRedirectingConstructorWithAnotherInitializer =
     const MessageCode("RedirectingConstructorWithAnotherInitializer",
         analyzerCodes: <String>["FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR"],
-        message:
+        problemMessage:
             r"""A redirecting constructor can't have other initializers.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8558,8 +8734,8 @@
 const MessageCode messageRedirectingConstructorWithBody = const MessageCode(
     "RedirectingConstructorWithBody",
     index: 22,
-    message: r"""Redirecting constructors can't have a body.""",
-    tip:
+    problemMessage: r"""Redirecting constructors can't have a body.""",
+    correctionMessage:
         r"""Try removing the body, or not making this a redirecting constructor.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8571,7 +8747,7 @@
     messageRedirectingConstructorWithMultipleRedirectInitializers =
     const MessageCode("RedirectingConstructorWithMultipleRedirectInitializers",
         analyzerCodes: <String>["MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS"],
-        message:
+        problemMessage:
             r"""A redirecting constructor can't have more than one redirection.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8582,7 +8758,7 @@
 const MessageCode messageRedirectingConstructorWithSuperInitializer =
     const MessageCode("RedirectingConstructorWithSuperInitializer",
         analyzerCodes: <String>["SUPER_IN_REDIRECTING_CONSTRUCTOR"],
-        message:
+        problemMessage:
             r"""A redirecting constructor can't have a 'super' initializer.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8592,15 +8768,16 @@
 const MessageCode messageRedirectionInNonFactory = const MessageCode(
     "RedirectionInNonFactory",
     index: 21,
-    message: r"""Only factory constructor can specify '=' redirection.""",
-    tip:
+    problemMessage:
+        r"""Only factory constructor can specify '=' redirection.""",
+    correctionMessage:
         r"""Try making this a factory constructor, or remove the redirection.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateRedirectionTargetNotFound =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Redirection constructor target not found: '#name'""",
         withArguments: _withArgumentsRedirectionTargetNotFound);
 
@@ -8614,7 +8791,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeRedirectionTargetNotFound,
-      message: """Redirection constructor target not found: '${name}'""",
+      problemMessage: """Redirection constructor target not found: '${name}'""",
       arguments: {'name': name});
 }
 
@@ -8622,7 +8799,7 @@
 const Template<Message Function(String name)>
     templateRequiredNamedParameterHasDefaultValueError =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Named parameter '#name' is required and can't have a default value.""",
         withArguments:
             _withArgumentsRequiredNamedParameterHasDefaultValueError);
@@ -8639,7 +8816,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeRequiredNamedParameterHasDefaultValueError,
-      message:
+      problemMessage:
           """Named parameter '${name}' is required and can't have a default value.""",
       arguments: {'name': name});
 }
@@ -8652,8 +8829,8 @@
 const MessageCode messageRequiredParameterWithDefault = const MessageCode(
     "RequiredParameterWithDefault",
     analyzerCodes: <String>["NAMED_PARAMETER_OUTSIDE_GROUP"],
-    message: r"""Non-optional parameters can't have a default value.""",
-    tip:
+    problemMessage: r"""Non-optional parameters can't have a default value.""",
+    correctionMessage:
         r"""Try removing the default value or making the parameter optional.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8662,7 +8839,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageRethrowNotCatch = const MessageCode("RethrowNotCatch",
     analyzerCodes: <String>["RETHROW_OUTSIDE_CATCH"],
-    message: r"""'rethrow' can only be used in catch clauses.""");
+    problemMessage: r"""'rethrow' can only be used in catch clauses.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeReturnFromVoidFunction = messageReturnFromVoidFunction;
@@ -8671,7 +8848,7 @@
 const MessageCode messageReturnFromVoidFunction = const MessageCode(
     "ReturnFromVoidFunction",
     analyzerCodes: <String>["RETURN_OF_INVALID_TYPE"],
-    message: r"""Can't return a value from a void function.""");
+    problemMessage: r"""Can't return a value from a void function.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeReturnTypeFunctionExpression =
@@ -8680,7 +8857,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageReturnTypeFunctionExpression = const MessageCode(
     "ReturnTypeFunctionExpression",
-    message: r"""A function expression can't have a return type.""");
+    problemMessage: r"""A function expression can't have a return type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeReturnWithoutExpression = messageReturnWithoutExpression;
@@ -8690,7 +8867,8 @@
     "ReturnWithoutExpression",
     analyzerCodes: <String>["RETURN_WITHOUT_VALUE"],
     severity: Severity.warning,
-    message: r"""Must explicitly return a value from a non-void function.""");
+    problemMessage:
+        r"""Must explicitly return a value from a non-void function.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeReturnWithoutExpressionAsync =
@@ -8699,7 +8877,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageReturnWithoutExpressionAsync = const MessageCode(
     "ReturnWithoutExpressionAsync",
-    message:
+    problemMessage:
         r"""A value must be explicitly returned from a non-void async function.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8709,13 +8887,13 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageReturnWithoutExpressionSync = const MessageCode(
     "ReturnWithoutExpressionSync",
-    message:
+    problemMessage:
         r"""A value must be explicitly returned from a non-void function.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Uri uri_)> templateSdkRootNotFound =
     const Template<Message Function(Uri uri_)>(
-        messageTemplate: r"""SDK root directory not found: #uri.""",
+        problemMessageTemplate: r"""SDK root directory not found: #uri.""",
         withArguments: _withArgumentsSdkRootNotFound);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8728,7 +8906,7 @@
 Message _withArgumentsSdkRootNotFound(Uri uri_) {
   String? uri = relativizeUri(uri_);
   return new Message(codeSdkRootNotFound,
-      message: """SDK root directory not found: ${uri}.""",
+      problemMessage: """SDK root directory not found: ${uri}.""",
       arguments: {'uri': uri_});
 }
 
@@ -8738,8 +8916,8 @@
         Uri
             uri_)> templateSdkSpecificationNotFound = const Template<
         Message Function(Uri uri_)>(
-    messageTemplate: r"""SDK libraries specification not found: #uri.""",
-    tipTemplate:
+    problemMessageTemplate: r"""SDK libraries specification not found: #uri.""",
+    correctionMessageTemplate:
         r"""Normally, the specification is a file named 'libraries.json' in the Dart SDK install location.""",
     withArguments: _withArgumentsSdkSpecificationNotFound);
 
@@ -8753,8 +8931,8 @@
 Message _withArgumentsSdkSpecificationNotFound(Uri uri_) {
   String? uri = relativizeUri(uri_);
   return new Message(codeSdkSpecificationNotFound,
-      message: """SDK libraries specification not found: ${uri}.""",
-      tip:
+      problemMessage: """SDK libraries specification not found: ${uri}.""",
+      correctionMessage:
           """Normally, the specification is a file named 'libraries.json' in the Dart SDK install location.""",
       arguments: {'uri': uri_});
 }
@@ -8762,7 +8940,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Uri uri_)> templateSdkSummaryNotFound =
     const Template<Message Function(Uri uri_)>(
-        messageTemplate: r"""SDK summary not found: #uri.""",
+        problemMessageTemplate: r"""SDK summary not found: #uri.""",
         withArguments: _withArgumentsSdkSummaryNotFound);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8775,7 +8953,8 @@
 Message _withArgumentsSdkSummaryNotFound(Uri uri_) {
   String? uri = relativizeUri(uri_);
   return new Message(codeSdkSummaryNotFound,
-      message: """SDK summary not found: ${uri}.""", arguments: {'uri': uri_});
+      problemMessage: """SDK summary not found: ${uri}.""",
+      arguments: {'uri': uri_});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8785,7 +8964,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSetLiteralTooManyTypeArguments = const MessageCode(
     "SetLiteralTooManyTypeArguments",
-    message: r"""A set literal requires exactly one type argument.""");
+    problemMessage: r"""A set literal requires exactly one type argument.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeSetOrMapLiteralTooManyTypeArguments =
@@ -8794,7 +8973,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSetOrMapLiteralTooManyTypeArguments = const MessageCode(
     "SetOrMapLiteralTooManyTypeArguments",
-    message:
+    problemMessage:
         r"""A set or map literal requires exactly one or two type arguments, respectively.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8804,13 +8983,13 @@
 const MessageCode messageSetterConstructor = const MessageCode(
     "SetterConstructor",
     index: 104,
-    message: r"""Constructors can't be a setter.""",
-    tip: r"""Try removing 'set'.""");
+    problemMessage: r"""Constructors can't be a setter.""",
+    correctionMessage: r"""Try removing 'set'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateSetterNotFound =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Setter not found: '#name'.""",
+        problemMessageTemplate: r"""Setter not found: '#name'.""",
         withArguments: _withArgumentsSetterNotFound);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8823,7 +9002,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeSetterNotFound,
-      message: """Setter not found: '${name}'.""", arguments: {'name': name});
+      problemMessage: """Setter not found: '${name}'.""",
+      arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8832,7 +9012,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSetterNotSync = const MessageCode("SetterNotSync",
     analyzerCodes: <String>["INVALID_MODIFIER_ON_SETTER"],
-    message: r"""Setters can't use 'async', 'async*', or 'sync*'.""");
+    problemMessage: r"""Setters can't use 'async', 'async*', or 'sync*'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeSetterWithWrongNumberOfFormals =
@@ -8842,7 +9022,7 @@
 const MessageCode messageSetterWithWrongNumberOfFormals = const MessageCode(
     "SetterWithWrongNumberOfFormals",
     analyzerCodes: <String>["WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER"],
-    message: r"""A setter should have exactly one formal parameter.""");
+    problemMessage: r"""A setter should have exactly one formal parameter.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -8855,7 +9035,7 @@
             _num3)> templateSourceBodySummary = const Template<
         Message Function(
             int count, int count2, num _num1, num _num2, num _num3)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Built bodies for #count compilation units (#count2 bytes) in #num1%.3ms, that is,
 #num2%12.3 bytes/ms, and
 #num3%12.3 ms/compilation unit.""",
@@ -8886,7 +9066,7 @@
   if (_num3 == null) throw 'No number provided';
   String num3 = _num3.toStringAsFixed(3).padLeft(12);
   return new Message(codeSourceBodySummary,
-      message:
+      problemMessage:
           """Built bodies for ${count} compilation units (${count2} bytes) in ${num1}ms, that is,
 ${num2} bytes/ms, and
 ${num3} ms/compilation unit.""",
@@ -8910,7 +9090,7 @@
             _num3)> templateSourceOutlineSummary = const Template<
         Message Function(
             int count, int count2, num _num1, num _num2, num _num3)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Built outlines for #count compilation units (#count2 bytes) in #num1%.3ms, that is,
 #num2%12.3 bytes/ms, and
 #num3%12.3 ms/compilation unit.""",
@@ -8941,7 +9121,7 @@
   if (_num3 == null) throw 'No number provided';
   String num3 = _num3.toStringAsFixed(3).padLeft(12);
   return new Message(codeSourceOutlineSummary,
-      message:
+      problemMessage:
           """Built outlines for ${count} compilation units (${count2} bytes) in ${num1}ms, that is,
 ${num2} bytes/ms, and
 ${num3} ms/compilation unit.""",
@@ -8959,7 +9139,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSpreadElement = const MessageCode("SpreadElement",
-    severity: Severity.context, message: r"""Iterable spread.""");
+    severity: Severity.context, problemMessage: r"""Iterable spread.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeSpreadMapElement = messageSpreadMapElement;
@@ -8968,7 +9148,7 @@
 const MessageCode messageSpreadMapElement = const MessageCode(
     "SpreadMapElement",
     severity: Severity.context,
-    message: r"""Map spread.""");
+    problemMessage: r"""Map spread.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeStackOverflow = messageStackOverflow;
@@ -8976,8 +9156,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageStackOverflow = const MessageCode("StackOverflow",
     index: 19,
-    message: r"""The file has too many nested expressions or statements.""",
-    tip: r"""Try simplifying the code.""");
+    problemMessage:
+        r"""The file has too many nested expressions or statements.""",
+    correctionMessage: r"""Try simplifying the code.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeStaticAndInstanceConflict =
@@ -8987,7 +9168,8 @@
 const MessageCode messageStaticAndInstanceConflict = const MessageCode(
     "StaticAndInstanceConflict",
     analyzerCodes: <String>["CONFLICTING_STATIC_AND_INSTANCE"],
-    message: r"""This static member conflicts with an instance member.""");
+    problemMessage:
+        r"""This static member conflicts with an instance member.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeStaticAndInstanceConflictCause =
@@ -8997,7 +9179,7 @@
 const MessageCode messageStaticAndInstanceConflictCause = const MessageCode(
     "StaticAndInstanceConflictCause",
     severity: Severity.context,
-    message: r"""This is the instance member.""");
+    problemMessage: r"""This is the instance member.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeStaticConstructor = messageStaticConstructor;
@@ -9006,8 +9188,8 @@
 const MessageCode messageStaticConstructor = const MessageCode(
     "StaticConstructor",
     index: 4,
-    message: r"""Constructors can't be static.""",
-    tip: r"""Try removing the keyword 'static'.""");
+    problemMessage: r"""Constructors can't be static.""",
+    correctionMessage: r"""Try removing the keyword 'static'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeStaticOperator = messageStaticOperator;
@@ -9015,8 +9197,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageStaticOperator = const MessageCode("StaticOperator",
     index: 17,
-    message: r"""Operators can't be static.""",
-    tip: r"""Try removing the keyword 'static'.""");
+    problemMessage: r"""Operators can't be static.""",
+    correctionMessage: r"""Try removing the keyword 'static'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeStaticTearOffFromInstantiatedClass =
@@ -9025,9 +9207,9 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageStaticTearOffFromInstantiatedClass = const MessageCode(
     "StaticTearOffFromInstantiatedClass",
-    message:
+    problemMessage:
         r"""Cannot access static member on an instantiated generic class.""",
-    tip:
+    correctionMessage:
         r"""Try removing the type arguments or placing them after the member name.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9036,7 +9218,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageStrongModeNNBDButOptOut = const MessageCode(
     "StrongModeNNBDButOptOut",
-    message:
+    problemMessage:
         r"""A library can't opt out of null safety by default, when using sound null safety.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9045,7 +9227,7 @@
         List<String>
             _names)> templateStrongModeNNBDPackageOptOut = const Template<
         Message Function(List<String> _names)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Cannot run with sound null safety, because the following dependencies
 don't support null safety:
 
@@ -9066,7 +9248,7 @@
   if (_names.isEmpty) throw 'No names provided';
   String names = itemizeNames(_names);
   return new Message(codeStrongModeNNBDPackageOptOut,
-      message:
+      problemMessage:
           """Cannot run with sound null safety, because the following dependencies
 don't support null safety:
 
@@ -9083,7 +9265,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageStrongWithWeakDillLibrary = const MessageCode(
     "StrongWithWeakDillLibrary",
-    message:
+    problemMessage:
         r"""Loaded library is compiled with unsound null safety and cannot be used in compilation for sound null safety.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9093,8 +9275,8 @@
 const MessageCode messageSuperAsExpression = const MessageCode(
     "SuperAsExpression",
     analyzerCodes: <String>["SUPER_AS_EXPRESSION"],
-    message: r"""Can't use 'super' as an expression.""",
-    tip:
+    problemMessage: r"""Can't use 'super' as an expression.""",
+    correctionMessage:
         r"""To delegate a constructor to a super constructor, put the super call as an initializer.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9104,7 +9286,7 @@
 const MessageCode messageSuperAsIdentifier = const MessageCode(
     "SuperAsIdentifier",
     analyzerCodes: <String>["SUPER_AS_EXPRESSION"],
-    message: r"""Expected identifier, but got 'super'.""");
+    problemMessage: r"""Expected identifier, but got 'super'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeSuperInitializerNotLast = messageSuperInitializerNotLast;
@@ -9113,7 +9295,7 @@
 const MessageCode messageSuperInitializerNotLast = const MessageCode(
     "SuperInitializerNotLast",
     analyzerCodes: <String>["INVALID_SUPER_INVOCATION"],
-    message: r"""Can't have initializers after 'super'.""");
+    problemMessage: r"""Can't have initializers after 'super'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeSuperNullAware = messageSuperNullAware;
@@ -9121,15 +9303,16 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSuperNullAware = const MessageCode("SuperNullAware",
     index: 18,
-    message:
+    problemMessage:
         r"""The operator '?.' cannot be used with 'super' because 'super' cannot be null.""",
-    tip: r"""Try replacing '?.' with '.'""");
+    correctionMessage: r"""Try replacing '?.' with '.'""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateSuperclassHasNoConstructor =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Superclass has no constructor named '#name'.""",
+        problemMessageTemplate:
+            r"""Superclass has no constructor named '#name'.""",
         withArguments: _withArgumentsSuperclassHasNoConstructor);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9145,7 +9328,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeSuperclassHasNoConstructor,
-      message: """Superclass has no constructor named '${name}'.""",
+      problemMessage: """Superclass has no constructor named '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -9155,7 +9338,7 @@
         String
             name)> templateSuperclassHasNoDefaultConstructor = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The superclass, '#name', has no unnamed constructor that takes no arguments.""",
     withArguments: _withArgumentsSuperclassHasNoDefaultConstructor);
 
@@ -9171,7 +9354,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeSuperclassHasNoDefaultConstructor,
-      message:
+      problemMessage:
           """The superclass, '${name}', has no unnamed constructor that takes no arguments.""",
       arguments: {'name': name});
 }
@@ -9179,7 +9362,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateSuperclassHasNoGetter =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Superclass has no getter named '#name'.""",
+        problemMessageTemplate: r"""Superclass has no getter named '#name'.""",
         withArguments: _withArgumentsSuperclassHasNoGetter);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9192,14 +9375,14 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeSuperclassHasNoGetter,
-      message: """Superclass has no getter named '${name}'.""",
+      problemMessage: """Superclass has no getter named '${name}'.""",
       arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateSuperclassHasNoMember =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Superclass has no member named '#name'.""",
+        problemMessageTemplate: r"""Superclass has no member named '#name'.""",
         withArguments: _withArgumentsSuperclassHasNoMember);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9212,14 +9395,14 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeSuperclassHasNoMember,
-      message: """Superclass has no member named '${name}'.""",
+      problemMessage: """Superclass has no member named '${name}'.""",
       arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateSuperclassHasNoMethod =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Superclass has no method named '#name'.""",
+        problemMessageTemplate: r"""Superclass has no method named '#name'.""",
         withArguments: _withArgumentsSuperclassHasNoMethod);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9232,14 +9415,14 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeSuperclassHasNoMethod,
-      message: """Superclass has no method named '${name}'.""",
+      problemMessage: """Superclass has no method named '${name}'.""",
       arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateSuperclassHasNoSetter =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Superclass has no setter named '#name'.""",
+        problemMessageTemplate: r"""Superclass has no setter named '#name'.""",
         withArguments: _withArgumentsSuperclassHasNoSetter);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9252,7 +9435,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeSuperclassHasNoSetter,
-      message: """Superclass has no setter named '${name}'.""",
+      problemMessage: """Superclass has no setter named '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -9262,7 +9445,7 @@
         String
             name)> templateSuperclassMethodArgumentMismatch = const Template<
         Message Function(String name)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Superclass doesn't have a method named '#name' with matching arguments.""",
     withArguments: _withArgumentsSuperclassMethodArgumentMismatch);
 
@@ -9277,7 +9460,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeSuperclassMethodArgumentMismatch,
-      message:
+      problemMessage:
           """Superclass doesn't have a method named '${name}' with matching arguments.""",
       arguments: {'name': name});
 }
@@ -9288,12 +9471,13 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSupertypeIsFunction = const MessageCode(
     "SupertypeIsFunction",
-    message: r"""Can't use a function type as supertype.""");
+    problemMessage: r"""Can't use a function type as supertype.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateSupertypeIsIllegal =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""The type '#name' can't be used as supertype.""",
+        problemMessageTemplate:
+            r"""The type '#name' can't be used as supertype.""",
         withArguments: _withArgumentsSupertypeIsIllegal);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9306,14 +9490,14 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeSupertypeIsIllegal,
-      message: """The type '${name}' can't be used as supertype.""",
+      problemMessage: """The type '${name}' can't be used as supertype.""",
       arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateSupertypeIsTypeVariable =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type variable '#name' can't be used as supertype.""",
         withArguments: _withArgumentsSupertypeIsTypeVariable);
 
@@ -9327,7 +9511,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeSupertypeIsTypeVariable,
-      message: """The type variable '${name}' can't be used as supertype.""",
+      problemMessage:
+          """The type variable '${name}' can't be used as supertype.""",
       arguments: {'name': name});
 }
 
@@ -9338,7 +9523,7 @@
 const MessageCode messageSwitchCaseFallThrough = const MessageCode(
     "SwitchCaseFallThrough",
     analyzerCodes: <String>["CASE_BLOCK_NOT_TERMINATED"],
-    message: r"""Switch case may fall through to the next case.""");
+    problemMessage: r"""Switch case may fall through to the next case.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeSwitchExpressionNotAssignableCause =
@@ -9348,7 +9533,7 @@
 const MessageCode messageSwitchExpressionNotAssignableCause = const MessageCode(
     "SwitchExpressionNotAssignableCause",
     severity: Severity.context,
-    message: r"""The switch expression is here.""");
+    problemMessage: r"""The switch expression is here.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeSwitchHasCaseAfterDefault =
@@ -9358,9 +9543,10 @@
 const MessageCode messageSwitchHasCaseAfterDefault = const MessageCode(
     "SwitchHasCaseAfterDefault",
     index: 16,
-    message:
+    problemMessage:
         r"""The default case should be the last case in a switch statement.""",
-    tip: r"""Try moving the default case after the other case clauses.""");
+    correctionMessage:
+        r"""Try moving the default case after the other case clauses.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeSwitchHasMultipleDefaults =
@@ -9370,21 +9556,21 @@
 const MessageCode messageSwitchHasMultipleDefaults = const MessageCode(
     "SwitchHasMultipleDefaults",
     index: 15,
-    message: r"""The 'default' case can only be declared once.""",
-    tip: r"""Try removing all but one default case.""");
+    problemMessage: r"""The 'default' case can only be declared once.""",
+    correctionMessage: r"""Try removing all but one default case.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeSyntheticToken = messageSyntheticToken;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSyntheticToken = const MessageCode("SyntheticToken",
-    message: r"""This couldn't be parsed.""");
+    problemMessage: r"""This couldn't be parsed.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateThisAccessInFieldInitializer =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't access 'this' in a field initializer to read '#name'.""",
         withArguments: _withArgumentsThisAccessInFieldInitializer);
 
@@ -9398,7 +9584,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeThisAccessInFieldInitializer,
-      message:
+      problemMessage:
           """Can't access 'this' in a field initializer to read '${name}'.""",
       arguments: {'name': name});
 }
@@ -9410,7 +9596,7 @@
 const MessageCode messageThisAsIdentifier = const MessageCode(
     "ThisAsIdentifier",
     analyzerCodes: <String>["INVALID_REFERENCE_TO_THIS"],
-    message: r"""Expected identifier, but got 'this'.""");
+    problemMessage: r"""Expected identifier, but got 'this'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeThisInNullAwareReceiver = messageThisInNullAwareReceiver;
@@ -9419,14 +9605,14 @@
 const MessageCode messageThisInNullAwareReceiver = const MessageCode(
     "ThisInNullAwareReceiver",
     severity: Severity.warning,
-    message: r"""The receiver 'this' cannot be null.""",
-    tip: r"""Try replacing '?.' with '.'""");
+    problemMessage: r"""The receiver 'this' cannot be null.""",
+    correctionMessage: r"""Try replacing '?.' with '.'""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string)> templateThisNotPromoted =
     const Template<Message Function(String string)>(
-        messageTemplate: r"""'this' can't be promoted.""",
-        tipTemplate: r"""See #string""",
+        problemMessageTemplate: r"""'this' can't be promoted.""",
+        correctionMessageTemplate: r"""See #string""",
         withArguments: _withArgumentsThisNotPromoted);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9439,8 +9625,8 @@
 Message _withArgumentsThisNotPromoted(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeThisNotPromoted,
-      message: """'this' can't be promoted.""",
-      tip: """See ${string}""",
+      problemMessage: """'this' can't be promoted.""",
+      correctionMessage: """See ${string}""",
       arguments: {'string': string});
 }
 
@@ -9448,7 +9634,8 @@
 const Template<Message Function(String string)>
     templateThisOrSuperAccessInFieldInitializer =
     const Template<Message Function(String string)>(
-        messageTemplate: r"""Can't access '#string' in a field initializer.""",
+        problemMessageTemplate:
+            r"""Can't access '#string' in a field initializer.""",
         withArguments: _withArgumentsThisOrSuperAccessInFieldInitializer);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9462,7 +9649,7 @@
 Message _withArgumentsThisOrSuperAccessInFieldInitializer(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeThisOrSuperAccessInFieldInitializer,
-      message: """Can't access '${string}' in a field initializer.""",
+      problemMessage: """Can't access '${string}' in a field initializer.""",
       arguments: {'string': string});
 }
 
@@ -9473,7 +9660,7 @@
         int
             count2)> templateTooFewArguments = const Template<
         Message Function(int count, int count2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Too few positional arguments: #count required, #count2 given.""",
     withArguments: _withArgumentsTooFewArguments);
 
@@ -9489,7 +9676,7 @@
   // ignore: unnecessary_null_comparison
   if (count2 == null) throw 'No count provided';
   return new Message(codeTooFewArguments,
-      message:
+      problemMessage:
           """Too few positional arguments: ${count} required, ${count2} given.""",
       arguments: {'count': count, 'count2': count2});
 }
@@ -9501,9 +9688,10 @@
         int
             count2)> templateTooManyArguments = const Template<
         Message Function(int count, int count2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Too many positional arguments: #count allowed, but #count2 found.""",
-    tipTemplate: r"""Try removing the extra positional arguments.""",
+    correctionMessageTemplate:
+        r"""Try removing the extra positional arguments.""",
     withArguments: _withArgumentsTooManyArguments);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9518,9 +9706,9 @@
   // ignore: unnecessary_null_comparison
   if (count2 == null) throw 'No count provided';
   return new Message(codeTooManyArguments,
-      message:
+      problemMessage:
           """Too many positional arguments: ${count} allowed, but ${count2} found.""",
-      tip: """Try removing the extra positional arguments.""",
+      correctionMessage: """Try removing the extra positional arguments.""",
       arguments: {'count': count, 'count2': count2});
 }
 
@@ -9531,8 +9719,8 @@
 const MessageCode messageTopLevelOperator = const MessageCode(
     "TopLevelOperator",
     index: 14,
-    message: r"""Operators must be declared within a class.""",
-    tip:
+    problemMessage: r"""Operators must be declared within a class.""",
+    correctionMessage:
         r"""Try removing the operator, moving it to a class, or converting it to be a function.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9541,14 +9729,14 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageTypeAfterVar = const MessageCode("TypeAfterVar",
     index: 89,
-    message:
+    problemMessage:
         r"""Variables can't be declared using both 'var' and a type name.""",
-    tip: r"""Try removing 'var.'""");
+    correctionMessage: r"""Try removing 'var.'""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(int count)> templateTypeArgumentMismatch =
     const Template<Message Function(int count)>(
-        messageTemplate: r"""Expected #count type arguments.""",
+        problemMessageTemplate: r"""Expected #count type arguments.""",
         withArguments: _withArgumentsTypeArgumentMismatch);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9561,7 +9749,7 @@
   // ignore: unnecessary_null_comparison
   if (count == null) throw 'No count provided';
   return new Message(codeTypeArgumentMismatch,
-      message: """Expected ${count} type arguments.""",
+      problemMessage: """Expected ${count} type arguments.""",
       arguments: {'count': count});
 }
 
@@ -9569,9 +9757,9 @@
 const Template<Message Function(String name)>
     templateTypeArgumentsOnTypeVariable =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't use type arguments with type variable '#name'.""",
-        tipTemplate: r"""Try removing the type arguments.""",
+        correctionMessageTemplate: r"""Try removing the type arguments.""",
         withArguments: _withArgumentsTypeArgumentsOnTypeVariable);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9584,8 +9772,9 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeTypeArgumentsOnTypeVariable,
-      message: """Can't use type arguments with type variable '${name}'.""",
-      tip: """Try removing the type arguments.""",
+      problemMessage:
+          """Can't use type arguments with type variable '${name}'.""",
+      correctionMessage: """Try removing the type arguments.""",
       arguments: {'name': name});
 }
 
@@ -9596,13 +9785,14 @@
 const MessageCode messageTypeBeforeFactory = const MessageCode(
     "TypeBeforeFactory",
     index: 57,
-    message: r"""Factory constructors cannot have a return type.""",
-    tip: r"""Try removing the type appearing before 'factory'.""");
+    problemMessage: r"""Factory constructors cannot have a return type.""",
+    correctionMessage:
+        r"""Try removing the type appearing before 'factory'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateTypeNotFound =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""Type '#name' not found.""",
+        problemMessageTemplate: r"""Type '#name' not found.""",
         withArguments: _withArgumentsTypeNotFound);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9615,13 +9805,14 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeTypeNotFound,
-      message: """Type '${name}' not found.""", arguments: {'name': name});
+      problemMessage: """Type '${name}' not found.""",
+      arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name, Uri uri_)> templateTypeOrigin =
     const Template<Message Function(String name, Uri uri_)>(
-        messageTemplate: r"""'#name' is from '#uri'.""",
+        problemMessageTemplate: r"""'#name' is from '#uri'.""",
         withArguments: _withArgumentsTypeOrigin);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9636,7 +9827,7 @@
   name = demangleMixinApplicationName(name);
   String? uri = relativizeUri(uri_);
   return new Message(codeTypeOrigin,
-      message: """'${name}' is from '${uri}'.""",
+      problemMessage: """'${name}' is from '${uri}'.""",
       arguments: {'name': name, 'uri': uri_});
 }
 
@@ -9644,7 +9835,7 @@
 const Template<Message Function(String name, Uri uri_, Uri uri2_)>
     templateTypeOriginWithFileUri =
     const Template<Message Function(String name, Uri uri_, Uri uri2_)>(
-        messageTemplate: r"""'#name' is from '#uri' ('#uri2').""",
+        problemMessageTemplate: r"""'#name' is from '#uri' ('#uri2').""",
         withArguments: _withArgumentsTypeOriginWithFileUri);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9661,7 +9852,7 @@
   String? uri = relativizeUri(uri_);
   String? uri2 = relativizeUri(uri2_);
   return new Message(codeTypeOriginWithFileUri,
-      message: """'${name}' is from '${uri}' ('${uri2}').""",
+      problemMessage: """'${name}' is from '${uri}' ('${uri2}').""",
       arguments: {'name': name, 'uri': uri_, 'uri2': uri2_});
 }
 
@@ -9673,13 +9864,14 @@
 const MessageCode messageTypeVariableDuplicatedName = const MessageCode(
     "TypeVariableDuplicatedName",
     analyzerCodes: <String>["DUPLICATE_DEFINITION"],
-    message: r"""A type variable can't have the same name as another.""");
+    problemMessage:
+        r"""A type variable can't have the same name as another.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateTypeVariableDuplicatedNameCause =
     const Template<Message Function(String name)>(
-        messageTemplate: r"""The other type variable named '#name'.""",
+        problemMessageTemplate: r"""The other type variable named '#name'.""",
         withArguments: _withArgumentsTypeVariableDuplicatedNameCause);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9692,7 +9884,7 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeTypeVariableDuplicatedNameCause,
-      message: """The other type variable named '${name}'.""",
+      problemMessage: """The other type variable named '${name}'.""",
       arguments: {'name': name});
 }
 
@@ -9704,7 +9896,7 @@
 const MessageCode messageTypeVariableInConstantContext = const MessageCode(
     "TypeVariableInConstantContext",
     analyzerCodes: <String>["TYPE_PARAMETER_IN_CONST_EXPRESSION"],
-    message: r"""Type variables can't be used as constants.""");
+    problemMessage: r"""Type variables can't be used as constants.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeTypeVariableInStaticContext =
@@ -9714,7 +9906,7 @@
 const MessageCode messageTypeVariableInStaticContext = const MessageCode(
     "TypeVariableInStaticContext",
     analyzerCodes: <String>["TYPE_PARAMETER_REFERENCED_BY_STATIC"],
-    message: r"""Type variables can't be used in static members.""");
+    problemMessage: r"""Type variables can't be used in static members.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeTypeVariableSameNameAsEnclosing =
@@ -9724,7 +9916,7 @@
 const MessageCode messageTypeVariableSameNameAsEnclosing = const MessageCode(
     "TypeVariableSameNameAsEnclosing",
     analyzerCodes: <String>["CONFLICTING_TYPE_VARIABLE_AND_CLASS"],
-    message:
+    problemMessage:
         r"""A type variable can't have the same name as its enclosing declaration.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9733,7 +9925,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageTypedefCause = const MessageCode("TypedefCause",
     severity: Severity.context,
-    message: r"""The issue arises via this type alias.""");
+    problemMessage: r"""The issue arises via this type alias.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeTypedefInClass = messageTypedefInClass;
@@ -9741,8 +9933,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageTypedefInClass = const MessageCode("TypedefInClass",
     index: 7,
-    message: r"""Typedefs can't be declared inside classes.""",
-    tip: r"""Try moving the typedef to the top-level.""");
+    problemMessage: r"""Typedefs can't be declared inside classes.""",
+    correctionMessage: r"""Try moving the typedef to the top-level.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeTypedefNotFunction = messageTypedefNotFunction;
@@ -9751,7 +9943,7 @@
 const MessageCode messageTypedefNotFunction = const MessageCode(
     "TypedefNotFunction",
     analyzerCodes: <String>["INVALID_GENERIC_FUNCTION_TYPE"],
-    message: r"""Can't create typedef from non-function type.""");
+    problemMessage: r"""Can't create typedef from non-function type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeTypedefNotType = messageTypedefNotType;
@@ -9759,7 +9951,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageTypedefNotType = const MessageCode("TypedefNotType",
     analyzerCodes: <String>["INVALID_TYPE_IN_TYPEDEF"],
-    message: r"""Can't create typedef from non-type.""");
+    problemMessage: r"""Can't create typedef from non-type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeTypedefNullableType = messageTypedefNullableType;
@@ -9767,7 +9959,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageTypedefNullableType = const MessageCode(
     "TypedefNullableType",
-    message: r"""Can't create typedef from nullable type.""");
+    problemMessage: r"""Can't create typedef from nullable type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeTypedefTypeVariableNotConstructor =
@@ -9776,7 +9968,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageTypedefTypeVariableNotConstructor = const MessageCode(
     "TypedefTypeVariableNotConstructor",
-    message:
+    problemMessage:
         r"""Can't use a typedef denoting a type variable as a constructor, nor for a static member access.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9787,7 +9979,7 @@
 const MessageCode messageTypedefTypeVariableNotConstructorCause =
     const MessageCode("TypedefTypeVariableNotConstructorCause",
         severity: Severity.context,
-        message: r"""This is the type variable ultimately denoted.""");
+        problemMessage: r"""This is the type variable ultimately denoted.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeTypedefUnaliasedTypeCause =
@@ -9797,7 +9989,7 @@
 const MessageCode messageTypedefUnaliasedTypeCause = const MessageCode(
     "TypedefUnaliasedTypeCause",
     severity: Severity.context,
-    message: r"""This is the type denoted by the type alias.""");
+    problemMessage: r"""This is the type denoted by the type alias.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeUnexpectedDollarInString = messageUnexpectedDollarInString;
@@ -9806,9 +9998,9 @@
 const MessageCode messageUnexpectedDollarInString = const MessageCode(
     "UnexpectedDollarInString",
     analyzerCodes: <String>["UNEXPECTED_DOLLAR_IN_STRING"],
-    message:
+    problemMessage:
         r"""A '$' has special meaning inside a string, and must be followed by an identifier or an expression in curly braces ({}).""",
-    tip: r"""Try adding a backslash (\) to escape the '$'.""");
+    correctionMessage: r"""Try adding a backslash (\) to escape the '$'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -9816,7 +10008,7 @@
         Token
             token)> templateUnexpectedModifierInNonNnbd = const Template<
         Message Function(Token token)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The modifier '#lexeme' is only available in null safe libraries.""",
     withArguments: _withArgumentsUnexpectedModifierInNonNnbd);
 
@@ -9829,7 +10021,7 @@
 Message _withArgumentsUnexpectedModifierInNonNnbd(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeUnexpectedModifierInNonNnbd,
-      message:
+      problemMessage:
           """The modifier '${lexeme}' is only available in null safe libraries.""",
       arguments: {'lexeme': token});
 }
@@ -9837,7 +10029,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateUnexpectedToken =
     const Template<Message Function(Token token)>(
-        messageTemplate: r"""Unexpected token '#lexeme'.""",
+        problemMessageTemplate: r"""Unexpected token '#lexeme'.""",
         withArguments: _withArgumentsUnexpectedToken);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9849,7 +10041,7 @@
 Message _withArgumentsUnexpectedToken(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeUnexpectedToken,
-      message: """Unexpected token '${lexeme}'.""",
+      problemMessage: """Unexpected token '${lexeme}'.""",
       arguments: {'lexeme': token});
 }
 
@@ -9857,7 +10049,7 @@
 const Template<Message Function(String string, Token token)>
     templateUnmatchedToken =
     const Template<Message Function(String string, Token token)>(
-        messageTemplate: r"""Can't find '#string' to match '#lexeme'.""",
+        problemMessageTemplate: r"""Can't find '#string' to match '#lexeme'.""",
         withArguments: _withArgumentsUnmatchedToken);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9870,7 +10062,7 @@
   if (string.isEmpty) throw 'No string provided';
   String lexeme = token.lexeme;
   return new Message(codeUnmatchedToken,
-      message: """Can't find '${string}' to match '${lexeme}'.""",
+      problemMessage: """Can't find '${string}' to match '${lexeme}'.""",
       arguments: {'string': string, 'lexeme': token});
 }
 
@@ -9881,7 +10073,7 @@
         String
             name2)> templateUnresolvedPrefixInTypeAnnotation = const Template<
         Message Function(String name, String name2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""'#name.#name2' can't be used as a type because '#name' isn't defined.""",
     withArguments: _withArgumentsUnresolvedPrefixInTypeAnnotation);
 
@@ -9900,7 +10092,7 @@
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   return new Message(codeUnresolvedPrefixInTypeAnnotation,
-      message:
+      problemMessage:
           """'${name}.${name2}' can't be used as a type because '${name}' isn't defined.""",
       arguments: {'name': name, 'name2': name2});
 }
@@ -9908,7 +10100,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String string)> templateUnspecified =
     const Template<Message Function(String string)>(
-        messageTemplate: r"""#string""",
+        problemMessageTemplate: r"""#string""",
         withArguments: _withArgumentsUnspecified);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9921,7 +10113,7 @@
 Message _withArgumentsUnspecified(String string) {
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeUnspecified,
-      message: """${string}""", arguments: {'string': string});
+      problemMessage: """${string}""", arguments: {'string': string});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9930,14 +10122,14 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageUnsupportedDartExt = const MessageCode(
     "UnsupportedDartExt",
-    message: r"""Dart native extensions are no longer supported.""",
-    tip:
+    problemMessage: r"""Dart native extensions are no longer supported.""",
+    correctionMessage:
         r"""Migrate to using FFI instead (https://dart.dev/guides/libraries/c-interop)""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Token token)> templateUnsupportedOperator =
     const Template<Message Function(Token token)>(
-        messageTemplate: r"""The '#lexeme' operator is not supported.""",
+        problemMessageTemplate: r"""The '#lexeme' operator is not supported.""",
         withArguments: _withArgumentsUnsupportedOperator);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -9949,7 +10141,7 @@
 Message _withArgumentsUnsupportedOperator(Token token) {
   String lexeme = token.lexeme;
   return new Message(codeUnsupportedOperator,
-      message: """The '${lexeme}' operator is not supported.""",
+      problemMessage: """The '${lexeme}' operator is not supported.""",
       arguments: {'lexeme': token});
 }
 
@@ -9960,8 +10152,8 @@
 const MessageCode messageUnsupportedPrefixPlus = const MessageCode(
     "UnsupportedPrefixPlus",
     analyzerCodes: <String>["MISSING_IDENTIFIER"],
-    message: r"""'+' is not a prefix operator.""",
-    tip: r"""Try removing '+'.""");
+    problemMessage: r"""'+' is not a prefix operator.""",
+    correctionMessage: r"""Try removing '+'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeUnterminatedComment = messageUnterminatedComment;
@@ -9970,13 +10162,14 @@
 const MessageCode messageUnterminatedComment = const MessageCode(
     "UnterminatedComment",
     analyzerCodes: <String>["UNTERMINATED_MULTI_LINE_COMMENT"],
-    message: r"""Comment starting with '/*' must end with '*/'.""");
+    problemMessage: r"""Comment starting with '/*' must end with '*/'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String string, String string2)>
+const Template<
+        Message Function(String string, String string2)>
     templateUnterminatedString =
     const Template<Message Function(String string, String string2)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""String starting with #string must end with #string2.""",
         withArguments: _withArgumentsUnterminatedString);
 
@@ -9992,7 +10185,8 @@
   if (string.isEmpty) throw 'No string provided';
   if (string2.isEmpty) throw 'No string provided';
   return new Message(codeUnterminatedString,
-      message: """String starting with ${string} must end with ${string2}.""",
+      problemMessage:
+          """String starting with ${string} must end with ${string2}.""",
       arguments: {'string': string, 'string2': string2});
 }
 
@@ -10000,13 +10194,14 @@
 const Code<Null> codeUnterminatedToken = messageUnterminatedToken;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageUnterminatedToken =
-    const MessageCode("UnterminatedToken", message: r"""Incomplete token.""");
+const MessageCode messageUnterminatedToken = const MessageCode(
+    "UnterminatedToken",
+    problemMessage: r"""Incomplete token.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Uri uri_)> templateUntranslatableUri =
     const Template<Message Function(Uri uri_)>(
-        messageTemplate: r"""Not found: '#uri'""",
+        problemMessageTemplate: r"""Not found: '#uri'""",
         withArguments: _withArgumentsUntranslatableUri);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -10018,14 +10213,14 @@
 Message _withArgumentsUntranslatableUri(Uri uri_) {
   String? uri = relativizeUri(uri_);
   return new Message(codeUntranslatableUri,
-      message: """Not found: '${uri}'""", arguments: {'uri': uri_});
+      problemMessage: """Not found: '${uri}'""", arguments: {'uri': uri_});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateValueForRequiredParameterNotProvidedError =
     const Template<Message Function(String name)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Required named parameter '#name' must be provided.""",
         withArguments: _withArgumentsValueForRequiredParameterNotProvidedError);
 
@@ -10041,7 +10236,8 @@
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   return new Message(codeValueForRequiredParameterNotProvidedError,
-      message: """Required named parameter '${name}' must be provided.""",
+      problemMessage:
+          """Required named parameter '${name}' must be provided.""",
       arguments: {'name': name});
 }
 
@@ -10050,7 +10246,8 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageVarAsTypeName = const MessageCode("VarAsTypeName",
-    index: 61, message: r"""The keyword 'var' can't be used as a type name.""");
+    index: 61,
+    problemMessage: r"""The keyword 'var' can't be used as a type name.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeVarReturnType = messageVarReturnType;
@@ -10058,8 +10255,8 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageVarReturnType = const MessageCode("VarReturnType",
     index: 12,
-    message: r"""The return type can't be 'var'.""",
-    tip:
+    problemMessage: r"""The return type can't be 'var'.""",
+    correctionMessage:
         r"""Try removing the keyword 'var', or replacing it with the name of the return type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -10069,9 +10266,9 @@
         String
             string)> templateVariableCouldBeNullDueToWrite = const Template<
         Message Function(String name, String string)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Variable '#name' could not be promoted due to an assignment.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try null checking the variable after the assignment.  See #string""",
     withArguments: _withArgumentsVariableCouldBeNullDueToWrite);
 
@@ -10089,9 +10286,9 @@
   name = demangleMixinApplicationName(name);
   if (string.isEmpty) throw 'No string provided';
   return new Message(codeVariableCouldBeNullDueToWrite,
-      message:
+      problemMessage:
           """Variable '${name}' could not be promoted due to an assignment.""",
-      tip:
+      correctionMessage:
           """Try null checking the variable after the assignment.  See ${string}""",
       arguments: {'name': name, 'string': string});
 }
@@ -10104,7 +10301,8 @@
 const MessageCode messageVerificationErrorOriginContext = const MessageCode(
     "VerificationErrorOriginContext",
     severity: Severity.context,
-    message: r"""The node most likely is taken from here by a transformer.""");
+    problemMessage:
+        r"""The node most likely is taken from here by a transformer.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeVoidExpression = messageVoidExpression;
@@ -10112,7 +10310,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageVoidExpression = const MessageCode("VoidExpression",
     analyzerCodes: <String>["USE_OF_VOID_RESULT"],
-    message: r"""This expression has type 'void' and can't be used.""");
+    problemMessage: r"""This expression has type 'void' and can't be used.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeVoidWithTypeArguments = messageVoidWithTypeArguments;
@@ -10121,8 +10319,8 @@
 const MessageCode messageVoidWithTypeArguments = const MessageCode(
     "VoidWithTypeArguments",
     index: 100,
-    message: r"""Type 'void' can't have type arguments.""",
-    tip: r"""Try removing the type arguments.""");
+    problemMessage: r"""Type 'void' can't have type arguments.""",
+    correctionMessage: r"""Try removing the type arguments.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeWeakWithStrongDillLibrary =
@@ -10131,7 +10329,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageWeakWithStrongDillLibrary = const MessageCode(
     "WeakWithStrongDillLibrary",
-    message:
+    problemMessage:
         r"""Loaded library is compiled with sound null safety and cannot be used in compilation for unsound null safety.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -10141,9 +10339,9 @@
         String
             string2)> templateWebLiteralCannotBeRepresentedExactly = const Template<
         Message Function(String string, String string2)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The integer literal #string can't be represented exactly in JavaScript.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try changing the literal to something that can be represented in Javascript. In Javascript #string2 is the nearest value that can be represented exactly.""",
     withArguments: _withArgumentsWebLiteralCannotBeRepresentedExactly);
 
@@ -10160,9 +10358,9 @@
   if (string.isEmpty) throw 'No string provided';
   if (string2.isEmpty) throw 'No string provided';
   return new Message(codeWebLiteralCannotBeRepresentedExactly,
-      message:
+      problemMessage:
           """The integer literal ${string} can't be represented exactly in JavaScript.""",
-      tip: """Try changing the literal to something that can be represented in Javascript. In Javascript ${string2} is the nearest value that can be represented exactly.""",
+      correctionMessage: """Try changing the literal to something that can be represented in Javascript. In Javascript ${string2} is the nearest value that can be represented exactly.""",
       arguments: {'string': string, 'string2': string2});
 }
 
@@ -10173,8 +10371,9 @@
 const MessageCode messageWithBeforeExtends = const MessageCode(
     "WithBeforeExtends",
     index: 11,
-    message: r"""The extends clause must be before the with clause.""",
-    tip: r"""Try moving the extends clause before the with clause.""");
+    problemMessage: r"""The extends clause must be before the with clause.""",
+    correctionMessage:
+        r"""Try moving the extends clause before the with clause.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeYieldAsIdentifier = messageYieldAsIdentifier;
@@ -10183,7 +10382,7 @@
 const MessageCode messageYieldAsIdentifier = const MessageCode(
     "YieldAsIdentifier",
     analyzerCodes: <String>["ASYNC_KEYWORD_USED_AS_IDENTIFIER"],
-    message:
+    problemMessage:
         r"""'yield' can't be used as an identifier in 'async', 'async*', or 'sync*' methods.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -10193,4 +10392,5 @@
 const MessageCode messageYieldNotGenerator = const MessageCode(
     "YieldNotGenerator",
     analyzerCodes: <String>["YIELD_IN_NON_GENERATOR"],
-    message: r"""'yield' can only be used in 'sync*' or 'async*' methods.""");
+    problemMessage:
+        r"""'yield' can only be used in 'sync*' or 'async*' methods.""");
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/diagnostic_message.dart b/pkg/_fe_analyzer_shared/lib/src/messages/diagnostic_message.dart
index 14540d9..983ebb4 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/diagnostic_message.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/diagnostic_message.dart
@@ -66,7 +66,7 @@
 
 /// This method is subject to change.
 String? getMessageHeaderText(DiagnosticMessage message) {
-  return message is FormattedMessage ? message.message : null;
+  return message is FormattedMessage ? message.problemMessage : null;
 }
 
 /// This method is subject to change.
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/parser_error.dart b/pkg/_fe_analyzer_shared/lib/src/parser/parser_error.dart
index 8c46c13..16d647e 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/parser_error.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/parser_error.dart
@@ -22,5 +22,6 @@
   ParserError.fromTokens(Token begin, Token end, Message message)
       : this(begin.charOffset, end.charOffset + end.charCount, message);
 
-  String toString() => "@${beginOffset}: ${message.message}\n${message.tip}";
+  String toString() => "@${beginOffset}: ${message.problemMessage}\n"
+      "${message.correctionMessage}";
 }
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
index 208db61..1d103e5 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
@@ -96,7 +96,8 @@
         // If offset is available report and internal problem to show the
         // parsed code in the output.
         throw internalProblem(
-            new Message(const Code<String>('Internal error'), message: message),
+            new Message(const Code<String>('Internal error'),
+                problemMessage: message),
             token.charOffset,
             uri);
       } else {
@@ -198,7 +199,8 @@
         // If offset is available report and internal problem to show the
         // parsed code in the output.
         throw internalProblem(
-            new Message(const Code<String>('Internal error'), message: message),
+            new Message(const Code<String>('Internal error'),
+                problemMessage: message),
             token.charOffset,
             uri);
       } else {
@@ -480,7 +482,7 @@
   @override
   void handleRecoverableError(
       Message message, Token startToken, Token endToken) {
-    debugEvent("Error: ${message.message}");
+    debugEvent("Error: ${message.problemMessage}");
     if (isIgnoredError(message.code, startToken)) return;
     addProblem(
         message, startToken.charOffset, lengthOfSpan(startToken, endToken));
diff --git a/pkg/_fe_analyzer_shared/lib/src/scanner/error_token.dart b/pkg/_fe_analyzer_shared/lib/src/scanner/error_token.dart
index 9b39e96..35b4652 100644
--- a/pkg/_fe_analyzer_shared/lib/src/scanner/error_token.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/scanner/error_token.dart
@@ -73,7 +73,7 @@
   int get length => 1;
 
   String get lexeme {
-    String errorMsg = assertionMessage.message;
+    String errorMsg = assertionMessage.problemMessage;
 
     // Attempt to include the location which is calling the parser
     // in an effort to debug https://github.com/dart-lang/sdk/issues/37528
diff --git a/pkg/_fe_analyzer_shared/lib/src/util/options.dart b/pkg/_fe_analyzer_shared/lib/src/util/options.dart
index 7837865..17c3c01 100644
--- a/pkg/_fe_analyzer_shared/lib/src/util/options.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/util/options.dart
@@ -13,7 +13,7 @@
   CommandLineProblem.deprecated(String message)
       : this(templateUnspecified.withArguments(message));
 
-  String toString() => message.message;
+  String toString() => message.problemMessage;
 }
 
 class ParsedOptions {
diff --git a/pkg/analysis_server/test/verify_sorted_test.dart b/pkg/analysis_server/test/verify_sorted_test.dart
index dc12ccc..9033b16 100644
--- a/pkg/analysis_server/test/verify_sorted_test.dart
+++ b/pkg/analysis_server/test/verify_sorted_test.dart
@@ -85,7 +85,6 @@
     packagePath: 'analyzer',
     excludedPaths: [
       'lib/src/context/packages.dart',
-      'lib/src/dart/error/syntactic_errors.g.dart',
       'lib/src/summary/format.dart',
       'test/generated/test_all.dart',
     ],
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.analyzer.g.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.analyzer.g.dart
index 88cb1ff..9da2117 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.analyzer.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.analyzer.g.dart
@@ -9,14 +9,139 @@
 
 import "package:analyzer/error/error.dart";
 
-part "syntactic_errors.g.dart";
-
 // It is hard to visually separate each code's _doc comment_ from its published
 // _documentation comment_ when each is written as an end-of-line comment.
 // ignore_for_file: slash_for_doc_comments
 
+final fastaAnalyzerErrorCodes = <ErrorCode?>[
+  null,
+  ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND,
+  ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP,
+  ParserErrorCode.EXTERNAL_CLASS,
+  ParserErrorCode.STATIC_CONSTRUCTOR,
+  ParserErrorCode.EXTERNAL_ENUM,
+  ParserErrorCode.PREFIX_AFTER_COMBINATOR,
+  ParserErrorCode.TYPEDEF_IN_CLASS,
+  ParserErrorCode.EXPECTED_BODY,
+  ParserErrorCode.INVALID_AWAIT_IN_FOR,
+  ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE,
+  ParserErrorCode.WITH_BEFORE_EXTENDS,
+  ParserErrorCode.VAR_RETURN_TYPE,
+  ParserErrorCode.TYPE_ARGUMENTS_ON_TYPE_VARIABLE,
+  ParserErrorCode.TOP_LEVEL_OPERATOR,
+  ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES,
+  ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_CASE,
+  ParserErrorCode.STATIC_OPERATOR,
+  ParserErrorCode.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER,
+  ParserErrorCode.STACK_OVERFLOW,
+  ParserErrorCode.MISSING_CATCH_OR_FINALLY,
+  ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR,
+  ParserErrorCode.REDIRECTING_CONSTRUCTOR_WITH_BODY,
+  ParserErrorCode.NATIVE_CLAUSE_SHOULD_BE_ANNOTATION,
+  ParserErrorCode.MULTIPLE_WITH_CLAUSES,
+  ParserErrorCode.MULTIPLE_PART_OF_DIRECTIVES,
+  ParserErrorCode.MULTIPLE_ON_CLAUSES,
+  ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES,
+  ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES,
+  ParserErrorCode.MISSING_STATEMENT,
+  ParserErrorCode.MISSING_PREFIX_IN_DEFERRED_IMPORT,
+  ParserErrorCode.MISSING_KEYWORD_OPERATOR,
+  ParserErrorCode.MISSING_EXPRESSION_IN_THROW,
+  ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE,
+  ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER,
+  ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR,
+  ParserErrorCode.MISSING_INITIALIZER,
+  ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST,
+  ParserErrorCode.INVALID_UNICODE_ESCAPE,
+  ParserErrorCode.INVALID_OPERATOR,
+  ParserErrorCode.INVALID_HEX_ESCAPE,
+  ParserErrorCode.EXPECTED_INSTEAD,
+  ParserErrorCode.IMPLEMENTS_BEFORE_WITH,
+  ParserErrorCode.IMPLEMENTS_BEFORE_ON,
+  ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS,
+  ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE,
+  ParserErrorCode.EXPECTED_ELSE_OR_COMMA,
+  ParserErrorCode.INVALID_SUPER_IN_INITIALIZER,
+  ParserErrorCode.EXPERIMENT_NOT_ENABLED,
+  ParserErrorCode.EXTERNAL_METHOD_WITH_BODY,
+  ParserErrorCode.EXTERNAL_FIELD,
+  ParserErrorCode.ABSTRACT_CLASS_MEMBER,
+  ParserErrorCode.BREAK_OUTSIDE_OF_LOOP,
+  ParserErrorCode.CLASS_IN_CLASS,
+  ParserErrorCode.COLON_IN_PLACE_OF_IN,
+  ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE,
+  ParserErrorCode.MODIFIER_OUT_OF_ORDER,
+  ParserErrorCode.TYPE_BEFORE_FACTORY,
+  ParserErrorCode.CONST_AND_FINAL,
+  ParserErrorCode.CONFLICTING_MODIFIERS,
+  ParserErrorCode.CONST_CLASS,
+  ParserErrorCode.VAR_AS_TYPE_NAME,
+  ParserErrorCode.CONST_FACTORY,
+  ParserErrorCode.CONST_METHOD,
+  ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE,
+  ParserErrorCode.INVALID_THIS_IN_INITIALIZER,
+  ParserErrorCode.COVARIANT_AND_STATIC,
+  ParserErrorCode.COVARIANT_MEMBER,
+  ParserErrorCode.DEFERRED_AFTER_PREFIX,
+  ParserErrorCode.DIRECTIVE_AFTER_DECLARATION,
+  ParserErrorCode.DUPLICATED_MODIFIER,
+  ParserErrorCode.DUPLICATE_DEFERRED,
+  ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT,
+  ParserErrorCode.DUPLICATE_PREFIX,
+  ParserErrorCode.ENUM_IN_CLASS,
+  ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE,
+  ParserErrorCode.EXTERNAL_TYPEDEF,
+  ParserErrorCode.EXTRANEOUS_MODIFIER,
+  ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION,
+  ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
+  ParserErrorCode.FINAL_AND_COVARIANT,
+  ParserErrorCode.FINAL_AND_VAR,
+  ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH,
+  ParserErrorCode.CATCH_SYNTAX_EXTRA_PARAMETERS,
+  ParserErrorCode.CATCH_SYNTAX,
+  ParserErrorCode.EXTERNAL_FACTORY_REDIRECTION,
+  ParserErrorCode.EXTERNAL_FACTORY_WITH_BODY,
+  ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY,
+  ParserErrorCode.FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS,
+  ParserErrorCode.VAR_AND_TYPE,
+  ParserErrorCode.INVALID_INITIALIZER,
+  ParserErrorCode.ANNOTATION_WITH_TYPE_ARGUMENTS,
+  ParserErrorCode.EXTENSION_DECLARES_CONSTRUCTOR,
+  ParserErrorCode.EXTENSION_DECLARES_INSTANCE_FIELD,
+  ParserErrorCode.EXTENSION_DECLARES_ABSTRACT_MEMBER,
+  ParserErrorCode.MIXIN_DECLARES_CONSTRUCTOR,
+  ParserErrorCode.NULL_AWARE_CASCADE_OUT_OF_ORDER,
+  ParserErrorCode.MULTIPLE_VARIANCE_MODIFIERS,
+  ParserErrorCode.INVALID_USE_OF_COVARIANT_IN_EXTENSION,
+  ParserErrorCode.TYPE_PARAMETER_ON_CONSTRUCTOR,
+  ParserErrorCode.VOID_WITH_TYPE_ARGUMENTS,
+  ParserErrorCode.FINAL_AND_COVARIANT_LATE_WITH_INITIALIZER,
+  ParserErrorCode.INVALID_CONSTRUCTOR_NAME,
+  ParserErrorCode.GETTER_CONSTRUCTOR,
+  ParserErrorCode.SETTER_CONSTRUCTOR,
+  ParserErrorCode.MEMBER_WITH_CLASS_NAME,
+  ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_INITIALIZER,
+  ParserErrorCode.ABSTRACT_STATIC_FIELD,
+  ParserErrorCode.ABSTRACT_LATE_FIELD,
+  ParserErrorCode.EXTERNAL_LATE_FIELD,
+  ParserErrorCode.ABSTRACT_EXTERNAL_FIELD,
+  ParserErrorCode.ANNOTATION_ON_TYPE_ARGUMENT,
+  ParserErrorCode.BINARY_OPERATOR_WRITTEN_OUT,
+  ParserErrorCode.EXPECTED_IDENTIFIER_BUT_GOT_KEYWORD,
+  ParserErrorCode.ANNOTATION_WITH_TYPE_ARGUMENTS_UNINSTANTIATED,
+  ParserErrorCode.LITERAL_WITH_CLASS_AND_NEW,
+  ParserErrorCode.LITERAL_WITH_CLASS,
+  ParserErrorCode.LITERAL_WITH_NEW,
+  ParserErrorCode.CONSTRUCTOR_WITH_TYPE_ARGUMENTS,
+];
+
 class ParserErrorCode extends ErrorCode {
-  static const ParserErrorCode ABSTRACT_CLASS_MEMBER = _ABSTRACT_CLASS_MEMBER;
+  static const ParserErrorCode ABSTRACT_CLASS_MEMBER = ParserErrorCode(
+    'ABSTRACT_CLASS_MEMBER',
+    "Members of classes can't be declared to be 'abstract'.",
+    correction:
+        "Try removing the 'abstract' keyword. You can add the 'abstract' keyword before the class declaration.",
+  );
 
   static const ParserErrorCode ABSTRACT_ENUM = ParserErrorCode(
     'ABSTRACT_ENUM',
@@ -24,12 +149,23 @@
     correction: "Try removing the keyword 'abstract'.",
   );
 
-  static const ParserErrorCode ABSTRACT_EXTERNAL_FIELD =
-      _ABSTRACT_EXTERNAL_FIELD;
+  static const ParserErrorCode ABSTRACT_EXTERNAL_FIELD = ParserErrorCode(
+    'ABSTRACT_EXTERNAL_FIELD',
+    "Fields can't be declared both 'abstract' and 'external'.",
+    correction: "Try removing the 'abstract' or 'external' keyword.",
+  );
 
-  static const ParserErrorCode ABSTRACT_LATE_FIELD = _ABSTRACT_LATE_FIELD;
+  static const ParserErrorCode ABSTRACT_LATE_FIELD = ParserErrorCode(
+    'ABSTRACT_LATE_FIELD',
+    "Abstract fields cannot be late.",
+    correction: "Try removing the 'abstract' or 'late' keyword.",
+  );
 
-  static const ParserErrorCode ABSTRACT_STATIC_FIELD = _ABSTRACT_STATIC_FIELD;
+  static const ParserErrorCode ABSTRACT_STATIC_FIELD = ParserErrorCode(
+    'ABSTRACT_STATIC_FIELD',
+    "Static fields can't be declared 'abstract'.",
+    correction: "Try removing the 'abstract' or 'static' keyword.",
+  );
 
   static const ParserErrorCode ABSTRACT_STATIC_METHOD = ParserErrorCode(
     'ABSTRACT_STATIC_METHOD',
@@ -55,14 +191,21 @@
     correction: "Try removing the keyword 'abstract'.",
   );
 
-  static const ParserErrorCode ANNOTATION_ON_TYPE_ARGUMENT =
-      _ANNOTATION_ON_TYPE_ARGUMENT;
+  static const ParserErrorCode ANNOTATION_ON_TYPE_ARGUMENT = ParserErrorCode(
+    'ANNOTATION_ON_TYPE_ARGUMENT',
+    "Type arguments can't have annotations because they aren't declarations.",
+  );
 
-  static const ParserErrorCode ANNOTATION_WITH_TYPE_ARGUMENTS =
-      _ANNOTATION_WITH_TYPE_ARGUMENTS;
+  static const ParserErrorCode ANNOTATION_WITH_TYPE_ARGUMENTS = ParserErrorCode(
+    'ANNOTATION_WITH_TYPE_ARGUMENTS',
+    "An annotation can't use type arguments.",
+  );
 
   static const ParserErrorCode ANNOTATION_WITH_TYPE_ARGUMENTS_UNINSTANTIATED =
-      _ANNOTATION_WITH_TYPE_ARGUMENTS_UNINSTANTIATED;
+      ParserErrorCode(
+    'ANNOTATION_WITH_TYPE_ARGUMENTS_UNINSTANTIATED',
+    "An annotation with type arguments must be followed by an argument list.",
+  );
 
   /**
    * 16.32 Identifier Reference: It is a compile-time error if any of the
@@ -75,31 +218,76 @@
     "The keywords 'await' and 'yield' can't be used as identifiers in an asynchronous or generator function.",
   );
 
-  static const ParserErrorCode BINARY_OPERATOR_WRITTEN_OUT =
-      _BINARY_OPERATOR_WRITTEN_OUT;
+  static const ParserErrorCode BINARY_OPERATOR_WRITTEN_OUT = ParserErrorCode(
+    'BINARY_OPERATOR_WRITTEN_OUT',
+    "Binary operator '{0}' is written as '{1}' instead of the written out word.",
+    correction: "Try replacing '{0}' with '{1}'.",
+  );
 
-  static const ParserErrorCode BREAK_OUTSIDE_OF_LOOP = _BREAK_OUTSIDE_OF_LOOP;
+  static const ParserErrorCode BREAK_OUTSIDE_OF_LOOP = ParserErrorCode(
+    'BREAK_OUTSIDE_OF_LOOP',
+    "A break statement can't be used outside of a loop or switch statement.",
+    correction: "Try removing the break statement.",
+  );
 
-  static const ParserErrorCode CATCH_SYNTAX = _CATCH_SYNTAX;
+  static const ParserErrorCode CATCH_SYNTAX = ParserErrorCode(
+    'CATCH_SYNTAX',
+    "'catch' must be followed by '(identifier)' or '(identifier, identifier)'.",
+    correction:
+        "No types are needed, the first is given by 'on', the second is always 'StackTrace'.",
+  );
 
-  static const ParserErrorCode CATCH_SYNTAX_EXTRA_PARAMETERS =
-      _CATCH_SYNTAX_EXTRA_PARAMETERS;
+  static const ParserErrorCode CATCH_SYNTAX_EXTRA_PARAMETERS = ParserErrorCode(
+    'CATCH_SYNTAX_EXTRA_PARAMETERS',
+    "'catch' must be followed by '(identifier)' or '(identifier, identifier)'.",
+    correction:
+        "No types are needed, the first is given by 'on', the second is always 'StackTrace'.",
+  );
 
-  static const ParserErrorCode CLASS_IN_CLASS = _CLASS_IN_CLASS;
+  static const ParserErrorCode CLASS_IN_CLASS = ParserErrorCode(
+    'CLASS_IN_CLASS',
+    "Classes can't be declared inside other classes.",
+    correction: "Try moving the class to the top-level.",
+  );
 
-  static const ParserErrorCode COLON_IN_PLACE_OF_IN = _COLON_IN_PLACE_OF_IN;
+  static const ParserErrorCode COLON_IN_PLACE_OF_IN = ParserErrorCode(
+    'COLON_IN_PLACE_OF_IN',
+    "For-in loops use 'in' rather than a colon.",
+    correction: "Try replacing the colon with the keyword 'in'.",
+  );
 
-  static const ParserErrorCode CONFLICTING_MODIFIERS = _CONFLICTING_MODIFIERS;
+  static const ParserErrorCode CONFLICTING_MODIFIERS = ParserErrorCode(
+    'CONFLICTING_MODIFIERS',
+    "Members can't be declared to be both '{0}' and '{1}'.",
+    correction: "Try removing one of the keywords.",
+  );
 
-  static const ParserErrorCode CONSTRUCTOR_WITH_RETURN_TYPE =
-      _CONSTRUCTOR_WITH_RETURN_TYPE;
+  static const ParserErrorCode CONSTRUCTOR_WITH_RETURN_TYPE = ParserErrorCode(
+    'CONSTRUCTOR_WITH_RETURN_TYPE',
+    "Constructors can't have a return type.",
+    correction: "Try removing the return type.",
+  );
 
   static const ParserErrorCode CONSTRUCTOR_WITH_TYPE_ARGUMENTS =
-      _CONSTRUCTOR_WITH_TYPE_ARGUMENTS;
+      ParserErrorCode(
+    'CONSTRUCTOR_WITH_TYPE_ARGUMENTS',
+    "A constructor invocation can't have type arguments after the constructor name.",
+    correction:
+        "Try removing the type arguments or placing them after the class name.",
+  );
 
-  static const ParserErrorCode CONST_AND_FINAL = _CONST_AND_FINAL;
+  static const ParserErrorCode CONST_AND_FINAL = ParserErrorCode(
+    'CONST_AND_FINAL',
+    "Members can't be declared to be both 'const' and 'final'.",
+    correction: "Try removing either the 'const' or 'final' keyword.",
+  );
 
-  static const ParserErrorCode CONST_CLASS = _CONST_CLASS;
+  static const ParserErrorCode CONST_CLASS = ParserErrorCode(
+    'CONST_CLASS',
+    "Classes can't be declared to be 'const'.",
+    correction:
+        "Try removing the 'const' keyword. If you're trying to indicate that instances of the class can be constants, place the 'const' keyword on  the class' constructor(s).",
+  );
 
   static const ParserErrorCode CONST_CONSTRUCTOR_WITH_BODY = ParserErrorCode(
     'CONST_CONSTRUCTOR_WITH_BODY',
@@ -113,9 +301,18 @@
     correction: "Try removing the 'const' keyword.",
   );
 
-  static const ParserErrorCode CONST_FACTORY = _CONST_FACTORY;
+  static const ParserErrorCode CONST_FACTORY = ParserErrorCode(
+    'CONST_FACTORY',
+    "Only redirecting factory constructors can be declared to be 'const'.",
+    correction:
+        "Try removing the 'const' keyword, or replacing the body with '=' followed by a valid target.",
+  );
 
-  static const ParserErrorCode CONST_METHOD = _CONST_METHOD;
+  static const ParserErrorCode CONST_METHOD = ParserErrorCode(
+    'CONST_METHOD',
+    "Getters, setters and methods can't be declared to be 'const'.",
+    correction: "Try removing the 'const' keyword.",
+  );
 
   static const ParserErrorCode CONST_TYPEDEF = ParserErrorCode(
     'CONST_TYPEDEF',
@@ -123,13 +320,24 @@
     correction: "Try removing the 'const' keyword.",
   );
 
-  static const ParserErrorCode CONTINUE_OUTSIDE_OF_LOOP =
-      _CONTINUE_OUTSIDE_OF_LOOP;
+  static const ParserErrorCode CONTINUE_OUTSIDE_OF_LOOP = ParserErrorCode(
+    'CONTINUE_OUTSIDE_OF_LOOP',
+    "A continue statement can't be used outside of a loop or switch statement.",
+    correction: "Try removing the continue statement.",
+  );
 
-  static const ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE =
-      _CONTINUE_WITHOUT_LABEL_IN_CASE;
+  static const ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE = ParserErrorCode(
+    'CONTINUE_WITHOUT_LABEL_IN_CASE',
+    "A continue statement in a switch statement must have a label as a target.",
+    correction:
+        "Try adding a label associated with one of the case clauses to the continue statement.",
+  );
 
-  static const ParserErrorCode COVARIANT_AND_STATIC = _COVARIANT_AND_STATIC;
+  static const ParserErrorCode COVARIANT_AND_STATIC = ParserErrorCode(
+    'COVARIANT_AND_STATIC',
+    "Members can't be declared to be both 'covariant' and 'static'.",
+    correction: "Try removing either the 'covariant' or 'static' keyword.",
+  );
 
   static const ParserErrorCode COVARIANT_CONSTRUCTOR = ParserErrorCode(
     'COVARIANT_CONSTRUCTOR',
@@ -137,7 +345,11 @@
     correction: "Try removing the keyword 'covariant'.",
   );
 
-  static const ParserErrorCode COVARIANT_MEMBER = _COVARIANT_MEMBER;
+  static const ParserErrorCode COVARIANT_MEMBER = ParserErrorCode(
+    'COVARIANT_MEMBER',
+    "Getters, setters and methods can't be declared to be 'covariant'.",
+    correction: "Try removing the 'covariant' keyword.",
+  );
 
   static const ParserErrorCode COVARIANT_TOP_LEVEL_DECLARATION =
       ParserErrorCode(
@@ -181,27 +393,50 @@
     hasPublishedDocs: true,
   );
 
-  static const ParserErrorCode DEFERRED_AFTER_PREFIX = _DEFERRED_AFTER_PREFIX;
+  static const ParserErrorCode DEFERRED_AFTER_PREFIX = ParserErrorCode(
+    'DEFERRED_AFTER_PREFIX',
+    "The deferred keyword should come immediately before the prefix ('as' clause).",
+    correction: "Try moving the deferred keyword before the prefix.",
+  );
 
-  static const ParserErrorCode DIRECTIVE_AFTER_DECLARATION =
-      _DIRECTIVE_AFTER_DECLARATION;
+  static const ParserErrorCode DIRECTIVE_AFTER_DECLARATION = ParserErrorCode(
+    'DIRECTIVE_AFTER_DECLARATION',
+    "Directives must appear before any declarations.",
+    correction: "Try moving the directive before any declarations.",
+  );
 
   /**
    * Parameters:
    * 0: the modifier that was duplicated
    */
-  static const ParserErrorCode DUPLICATED_MODIFIER = _DUPLICATED_MODIFIER;
+  static const ParserErrorCode DUPLICATED_MODIFIER = ParserErrorCode(
+    'DUPLICATED_MODIFIER',
+    "The modifier '{0}' was already specified.",
+    correction: "Try removing all but one occurrence of the modifier.",
+  );
 
-  static const ParserErrorCode DUPLICATE_DEFERRED = _DUPLICATE_DEFERRED;
+  static const ParserErrorCode DUPLICATE_DEFERRED = ParserErrorCode(
+    'DUPLICATE_DEFERRED',
+    "An import directive can only have one 'deferred' keyword.",
+    correction: "Try removing all but one 'deferred' keyword.",
+  );
 
   /**
    * Parameters:
    * 0: the label that was duplicated
    */
   static const ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT =
-      _DUPLICATE_LABEL_IN_SWITCH_STATEMENT;
+      ParserErrorCode(
+    'DUPLICATE_LABEL_IN_SWITCH_STATEMENT',
+    "The label '{0}' was already used in this switch statement.",
+    correction: "Try choosing a different name for this label.",
+  );
 
-  static const ParserErrorCode DUPLICATE_PREFIX = _DUPLICATE_PREFIX;
+  static const ParserErrorCode DUPLICATE_PREFIX = ParserErrorCode(
+    'DUPLICATE_PREFIX',
+    "An import directive can only have one prefix ('as' clause).",
+    correction: "Try removing all but one prefix.",
+  );
 
   static const ParserErrorCode EMPTY_ENUM_BODY = ParserErrorCode(
     'EMPTY_ENUM_BODY',
@@ -209,12 +444,24 @@
     correction: "Try declaring a constant.",
   );
 
-  static const ParserErrorCode ENUM_IN_CLASS = _ENUM_IN_CLASS;
+  static const ParserErrorCode ENUM_IN_CLASS = ParserErrorCode(
+    'ENUM_IN_CLASS',
+    "Enums can't be declared inside classes.",
+    correction: "Try moving the enum to the top-level.",
+  );
 
   static const ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND =
-      _EQUALITY_CANNOT_BE_EQUALITY_OPERAND;
+      ParserErrorCode(
+    'EQUALITY_CANNOT_BE_EQUALITY_OPERAND',
+    "A comparison expression can't be an operand of another comparison expression.",
+    correction: "Try putting parentheses around one of the comparisons.",
+  );
 
-  static const ParserErrorCode EXPECTED_BODY = _EXPECTED_BODY;
+  static const ParserErrorCode EXPECTED_BODY = ParserErrorCode(
+    'EXPECTED_BODY',
+    "A {0} must have a body, even if it is empty.",
+    correction: "Try adding an empty body.",
+  );
 
   static const ParserErrorCode EXPECTED_CASE_OR_DEFAULT = ParserErrorCode(
     'EXPECTED_CASE_OR_DEFAULT',
@@ -228,7 +475,10 @@
     correction: "Try placing this code inside a class member.",
   );
 
-  static const ParserErrorCode EXPECTED_ELSE_OR_COMMA = _EXPECTED_ELSE_OR_COMMA;
+  static const ParserErrorCode EXPECTED_ELSE_OR_COMMA = ParserErrorCode(
+    'EXPECTED_ELSE_OR_COMMA',
+    "Expected 'else' or comma.",
+  );
 
   static const ParserErrorCode EXPECTED_EXECUTABLE = ParserErrorCode(
     'EXPECTED_EXECUTABLE',
@@ -238,9 +488,16 @@
   );
 
   static const ParserErrorCode EXPECTED_IDENTIFIER_BUT_GOT_KEYWORD =
-      _EXPECTED_IDENTIFIER_BUT_GOT_KEYWORD;
+      ParserErrorCode(
+    'EXPECTED_IDENTIFIER_BUT_GOT_KEYWORD',
+    "'{0}' can't be used as an identifier because it's a keyword.",
+    correction: "Try renaming this to be an identifier that isn't a keyword.",
+  );
 
-  static const ParserErrorCode EXPECTED_INSTEAD = _EXPECTED_INSTEAD;
+  static const ParserErrorCode EXPECTED_INSTEAD = ParserErrorCode(
+    'EXPECTED_INSTEAD',
+    "Expected '{0}' instead of this.",
+  );
 
   static const ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = ParserErrorCode(
     'EXPECTED_LIST_OR_MAP_LITERAL',
@@ -268,10 +525,19 @@
     "Expected a type name.",
   );
 
-  static const ParserErrorCode EXPERIMENT_NOT_ENABLED = _EXPERIMENT_NOT_ENABLED;
+  static const ParserErrorCode EXPERIMENT_NOT_ENABLED = ParserErrorCode(
+    'EXPERIMENT_NOT_ENABLED',
+    "This requires the '{0}' language feature to be enabled.",
+    correction:
+        "Try updating your pubspec.yaml to set the minimum SDK constraint to {1} or higher, and running 'pub get'.",
+  );
 
   static const ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE =
-      _EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE;
+      ParserErrorCode(
+    'EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE',
+    "Export directives must precede part directives.",
+    correction: "Try moving the export directives before the part directives.",
+  );
 
   /**
    * No parameters.
@@ -296,7 +562,12 @@
   //
   // Either provide an implementation for the member or remove it.
   static const ParserErrorCode EXTENSION_DECLARES_ABSTRACT_MEMBER =
-      _EXTENSION_DECLARES_ABSTRACT_MEMBER;
+      ParserErrorCode(
+    'EXTENSION_DECLARES_ABSTRACT_MEMBER',
+    "Extensions can't declare abstract members.",
+    correction: "Try providing an implementation for the member.",
+    hasPublishedDocs: true,
+  );
 
   /**
    * No parameters.
@@ -322,8 +593,12 @@
   // #### Common fixes
   //
   // Remove the constructor or replace it with a static method.
-  static const ParserErrorCode EXTENSION_DECLARES_CONSTRUCTOR =
-      _EXTENSION_DECLARES_CONSTRUCTOR;
+  static const ParserErrorCode EXTENSION_DECLARES_CONSTRUCTOR = ParserErrorCode(
+    'EXTENSION_DECLARES_CONSTRUCTOR',
+    "Extensions can't declare constructors.",
+    correction: "Try removing the constructor declaration.",
+    hasPublishedDocs: true,
+  );
 
   /**
    * No parameters.
@@ -351,25 +626,58 @@
   // Remove the field, make it a static field, or convert it to be a getter,
   // setter, or method.
   static const ParserErrorCode EXTENSION_DECLARES_INSTANCE_FIELD =
-      _EXTENSION_DECLARES_INSTANCE_FIELD;
+      ParserErrorCode(
+    'EXTENSION_DECLARES_INSTANCE_FIELD',
+    "Extensions can't declare instance fields",
+    correction:
+        "Try removing the field declaration or making it a static field",
+    hasPublishedDocs: true,
+  );
 
-  static const ParserErrorCode EXTERNAL_CLASS = _EXTERNAL_CLASS;
+  static const ParserErrorCode EXTERNAL_CLASS = ParserErrorCode(
+    'EXTERNAL_CLASS',
+    "Classes can't be declared to be 'external'.",
+    correction: "Try removing the keyword 'external'.",
+  );
 
-  static const ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY =
-      _EXTERNAL_CONSTRUCTOR_WITH_BODY;
+  static const ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = ParserErrorCode(
+    'EXTERNAL_CONSTRUCTOR_WITH_BODY',
+    "External constructors can't have a body.",
+    correction:
+        "Try removing the body of the constructor, or removing the keyword 'external'.",
+  );
 
   static const ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_INITIALIZER =
-      _EXTERNAL_CONSTRUCTOR_WITH_INITIALIZER;
+      ParserErrorCode(
+    'EXTERNAL_CONSTRUCTOR_WITH_INITIALIZER',
+    "An external constructor can't have any initializers.",
+  );
 
-  static const ParserErrorCode EXTERNAL_ENUM = _EXTERNAL_ENUM;
+  static const ParserErrorCode EXTERNAL_ENUM = ParserErrorCode(
+    'EXTERNAL_ENUM',
+    "Enums can't be declared to be 'external'.",
+    correction: "Try removing the keyword 'external'.",
+  );
 
-  static const ParserErrorCode EXTERNAL_FACTORY_REDIRECTION =
-      _EXTERNAL_FACTORY_REDIRECTION;
+  static const ParserErrorCode EXTERNAL_FACTORY_REDIRECTION = ParserErrorCode(
+    'EXTERNAL_FACTORY_REDIRECTION',
+    "A redirecting factory can't be external.",
+    correction: "Try removing the 'external' modifier.",
+  );
 
-  static const ParserErrorCode EXTERNAL_FACTORY_WITH_BODY =
-      _EXTERNAL_FACTORY_WITH_BODY;
+  static const ParserErrorCode EXTERNAL_FACTORY_WITH_BODY = ParserErrorCode(
+    'EXTERNAL_FACTORY_WITH_BODY',
+    "External factories can't have a body.",
+    correction:
+        "Try removing the body of the factory, or removing the keyword 'external'.",
+  );
 
-  static const ParserErrorCode EXTERNAL_FIELD = _EXTERNAL_FIELD;
+  static const ParserErrorCode EXTERNAL_FIELD = ParserErrorCode(
+    'EXTERNAL_FIELD',
+    "Fields can't be declared to be 'external'.",
+    correction:
+        "Try removing the keyword 'external', or replacing the field by an external getter and/or setter.",
+  );
 
   static const ParserErrorCode EXTERNAL_GETTER_WITH_BODY = ParserErrorCode(
     'EXTERNAL_GETTER_WITH_BODY',
@@ -378,10 +686,16 @@
         "Try removing the body of the getter, or removing the keyword 'external'.",
   );
 
-  static const ParserErrorCode EXTERNAL_LATE_FIELD = _EXTERNAL_LATE_FIELD;
+  static const ParserErrorCode EXTERNAL_LATE_FIELD = ParserErrorCode(
+    'EXTERNAL_LATE_FIELD',
+    "External fields cannot be late.",
+    correction: "Try removing the 'external' or 'late' keyword.",
+  );
 
-  static const ParserErrorCode EXTERNAL_METHOD_WITH_BODY =
-      _EXTERNAL_METHOD_WITH_BODY;
+  static const ParserErrorCode EXTERNAL_METHOD_WITH_BODY = ParserErrorCode(
+    'EXTERNAL_METHOD_WITH_BODY',
+    "An external or native method can't have a body.",
+  );
 
   static const ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = ParserErrorCode(
     'EXTERNAL_OPERATOR_WITH_BODY',
@@ -397,12 +711,23 @@
         "Try removing the body of the setter, or removing the keyword 'external'.",
   );
 
-  static const ParserErrorCode EXTERNAL_TYPEDEF = _EXTERNAL_TYPEDEF;
+  static const ParserErrorCode EXTERNAL_TYPEDEF = ParserErrorCode(
+    'EXTERNAL_TYPEDEF',
+    "Typedefs can't be declared to be 'external'.",
+    correction: "Try removing the keyword 'external'.",
+  );
 
-  static const ParserErrorCode EXTRANEOUS_MODIFIER = _EXTRANEOUS_MODIFIER;
+  static const ParserErrorCode EXTRANEOUS_MODIFIER = ParserErrorCode(
+    'EXTRANEOUS_MODIFIER',
+    "Can't have modifier '{0}' here.",
+    correction: "Try removing '{0}'.",
+  );
 
-  static const ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION =
-      _FACTORY_TOP_LEVEL_DECLARATION;
+  static const ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = ParserErrorCode(
+    'FACTORY_TOP_LEVEL_DECLARATION',
+    "Top-level declarations can't be declared to be 'factory'.",
+    correction: "Try removing the keyword 'factory'.",
+  );
 
   static const ParserErrorCode FACTORY_WITHOUT_BODY = ParserErrorCode(
     'FACTORY_WITHOUT_BODY',
@@ -418,17 +743,39 @@
   );
 
   static const ParserErrorCode FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS =
-      _FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS;
+      ParserErrorCode(
+    'FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS',
+    "A field can only be initialized in its declaring class",
+    correction:
+        "Try passing a value into the superclass constructor, or moving the initialization into the constructor body.",
+  );
 
   static const ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR =
-      _FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR;
+      ParserErrorCode(
+    'FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR',
+    "Field formal parameters can only be used in a constructor.",
+    correction: "Try removing 'this.'.",
+  );
 
-  static const ParserErrorCode FINAL_AND_COVARIANT = _FINAL_AND_COVARIANT;
+  static const ParserErrorCode FINAL_AND_COVARIANT = ParserErrorCode(
+    'FINAL_AND_COVARIANT',
+    "Members can't be declared to be both 'final' and 'covariant'.",
+    correction: "Try removing either the 'final' or 'covariant' keyword.",
+  );
 
   static const ParserErrorCode FINAL_AND_COVARIANT_LATE_WITH_INITIALIZER =
-      _FINAL_AND_COVARIANT_LATE_WITH_INITIALIZER;
+      ParserErrorCode(
+    'FINAL_AND_COVARIANT_LATE_WITH_INITIALIZER',
+    "Members marked 'late' with an initializer can't be declared to be both 'final' and 'covariant'.",
+    correction:
+        "Try removing either the 'final' or 'covariant' keyword, or removing the initializer.",
+  );
 
-  static const ParserErrorCode FINAL_AND_VAR = _FINAL_AND_VAR;
+  static const ParserErrorCode FINAL_AND_VAR = ParserErrorCode(
+    'FINAL_AND_VAR',
+    "Members can't be declared to be both 'final' and 'var'.",
+    correction: "Try removing the keyword 'var'.",
+  );
 
   static const ParserErrorCode FINAL_CLASS = ParserErrorCode(
     'FINAL_CLASS',
@@ -466,7 +813,11 @@
     correction: "Try replacing the keyword with a return type.",
   );
 
-  static const ParserErrorCode GETTER_CONSTRUCTOR = _GETTER_CONSTRUCTOR;
+  static const ParserErrorCode GETTER_CONSTRUCTOR = ParserErrorCode(
+    'GETTER_CONSTRUCTOR',
+    "Constructors can't be a getter.",
+    correction: "Try removing 'get'.",
+  );
 
   static const ParserErrorCode GETTER_IN_FUNCTION = ParserErrorCode(
     'GETTER_IN_FUNCTION',
@@ -483,22 +834,49 @@
   );
 
   static const ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE =
-      _ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE;
+      ParserErrorCode(
+    'ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE',
+    "Illegal assignment to non-assignable expression.",
+  );
 
-  static const ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS =
-      _IMPLEMENTS_BEFORE_EXTENDS;
+  static const ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = ParserErrorCode(
+    'IMPLEMENTS_BEFORE_EXTENDS',
+    "The extends clause must be before the implements clause.",
+    correction: "Try moving the extends clause before the implements clause.",
+  );
 
-  static const ParserErrorCode IMPLEMENTS_BEFORE_ON = _IMPLEMENTS_BEFORE_ON;
+  static const ParserErrorCode IMPLEMENTS_BEFORE_ON = ParserErrorCode(
+    'IMPLEMENTS_BEFORE_ON',
+    "The on clause must be before the implements clause.",
+    correction: "Try moving the on clause before the implements clause.",
+  );
 
-  static const ParserErrorCode IMPLEMENTS_BEFORE_WITH = _IMPLEMENTS_BEFORE_WITH;
+  static const ParserErrorCode IMPLEMENTS_BEFORE_WITH = ParserErrorCode(
+    'IMPLEMENTS_BEFORE_WITH',
+    "The with clause must be before the implements clause.",
+    correction: "Try moving the with clause before the implements clause.",
+  );
 
   static const ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE =
-      _IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE;
+      ParserErrorCode(
+    'IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE',
+    "Import directives must precede part directives.",
+    correction: "Try moving the import directives before the part directives.",
+  );
 
   static const ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH =
-      _INITIALIZED_VARIABLE_IN_FOR_EACH;
+      ParserErrorCode(
+    'INITIALIZED_VARIABLE_IN_FOR_EACH',
+    "The loop variable in a for-each loop can't be initialized.",
+    correction:
+        "Try removing the initializer, or using a different kind of loop.",
+  );
 
-  static const ParserErrorCode INVALID_AWAIT_IN_FOR = _INVALID_AWAIT_IN_FOR;
+  static const ParserErrorCode INVALID_AWAIT_IN_FOR = ParserErrorCode(
+    'INVALID_AWAIT_IN_FOR',
+    "The keyword 'await' isn't allowed for a normal 'for' statement.",
+    correction: "Try removing the keyword, or use a for-each statement.",
+  );
 
   /**
    * Parameters:
@@ -514,8 +892,10 @@
     "Comment references should contain a possibly prefixed identifier and can start with 'new', but shouldn't contain anything else.",
   );
 
-  static const ParserErrorCode INVALID_CONSTRUCTOR_NAME =
-      _INVALID_CONSTRUCTOR_NAME;
+  static const ParserErrorCode INVALID_CONSTRUCTOR_NAME = ParserErrorCode(
+    'INVALID_CONSTRUCTOR_NAME',
+    "The name of a constructor must match the name of the enclosing class.",
+  );
 
   static const ParserErrorCode INVALID_GENERIC_FUNCTION_TYPE = ParserErrorCode(
     'INVALID_GENERIC_FUNCTION_TYPE',
@@ -524,9 +904,16 @@
         "Try using a generic function type (returnType 'Function(' parameters ')').",
   );
 
-  static const ParserErrorCode INVALID_HEX_ESCAPE = _INVALID_HEX_ESCAPE;
+  static const ParserErrorCode INVALID_HEX_ESCAPE = ParserErrorCode(
+    'INVALID_HEX_ESCAPE',
+    "An escape sequence starting with '\\x' must be followed by 2 hexadecimal digits.",
+  );
 
-  static const ParserErrorCode INVALID_INITIALIZER = _INVALID_INITIALIZER;
+  static const ParserErrorCode INVALID_INITIALIZER = ParserErrorCode(
+    'INVALID_INITIALIZER',
+    "Not a valid initializer.",
+    correction: "To initialize a field, use the syntax 'name = value'.",
+  );
 
   static const ParserErrorCode INVALID_LITERAL_IN_CONFIGURATION =
       ParserErrorCode(
@@ -539,7 +926,10 @@
    * Parameters:
    * 0: the operator that is invalid
    */
-  static const ParserErrorCode INVALID_OPERATOR = _INVALID_OPERATOR;
+  static const ParserErrorCode INVALID_OPERATOR = ParserErrorCode(
+    'INVALID_OPERATOR',
+    "The string '{0}' isn't a user-definable operator.",
+  );
 
   /**
    * Parameters:
@@ -554,7 +944,11 @@
   );
 
   static const ParserErrorCode INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER =
-      _INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER;
+      ParserErrorCode(
+    'INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER',
+    "The operator '?.' cannot be used with 'super' because 'super' cannot be null.",
+    correction: "Try replacing '?.' with '.'",
+  );
 
   static const ParserErrorCode INVALID_STAR_AFTER_ASYNC = ParserErrorCode(
     'INVALID_STAR_AFTER_ASYNC',
@@ -562,8 +956,10 @@
     correction: "Try converting the body to a block.",
   );
 
-  static const ParserErrorCode INVALID_SUPER_IN_INITIALIZER =
-      _INVALID_SUPER_IN_INITIALIZER;
+  static const ParserErrorCode INVALID_SUPER_IN_INITIALIZER = ParserErrorCode(
+    'INVALID_SUPER_IN_INITIALIZER',
+    "Can only use 'super' in an initializer for calling the superclass constructor (e.g. 'super()' or 'super.namedConstructor()')",
+  );
 
   static const ParserErrorCode INVALID_SYNC = ParserErrorCode(
     'INVALID_SYNC',
@@ -571,10 +967,15 @@
     correction: "Try converting the body to a block.",
   );
 
-  static const ParserErrorCode INVALID_THIS_IN_INITIALIZER =
-      _INVALID_THIS_IN_INITIALIZER;
+  static const ParserErrorCode INVALID_THIS_IN_INITIALIZER = ParserErrorCode(
+    'INVALID_THIS_IN_INITIALIZER',
+    "Can only use 'this' in an initializer for field initialization (e.g. 'this.x = something') and constructor redirection (e.g. 'this()' or 'this.namedConstructor())",
+  );
 
-  static const ParserErrorCode INVALID_UNICODE_ESCAPE = _INVALID_UNICODE_ESCAPE;
+  static const ParserErrorCode INVALID_UNICODE_ESCAPE = ParserErrorCode(
+    'INVALID_UNICODE_ESCAPE',
+    "An escape sequence starting with '\\u' must be followed by 4 hexadecimal digits or from 1 to 6 digits between '{' and '}'.",
+  );
 
   /**
    * No parameters.
@@ -607,17 +1008,36 @@
   // }
   // ```
   static const ParserErrorCode INVALID_USE_OF_COVARIANT_IN_EXTENSION =
-      _INVALID_USE_OF_COVARIANT_IN_EXTENSION;
+      ParserErrorCode(
+    'INVALID_USE_OF_COVARIANT_IN_EXTENSION',
+    "Can't have modifier '{0}' in an extension.",
+    correction: "Try removing '{0}'.",
+    hasPublishedDocs: true,
+  );
 
-  static const ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST =
-      _LIBRARY_DIRECTIVE_NOT_FIRST;
+  static const ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = ParserErrorCode(
+    'LIBRARY_DIRECTIVE_NOT_FIRST',
+    "The library directive must appear before all other directives.",
+    correction: "Try moving the library directive before any other directives.",
+  );
 
-  static const ParserErrorCode LITERAL_WITH_CLASS = _LITERAL_WITH_CLASS;
+  static const ParserErrorCode LITERAL_WITH_CLASS = ParserErrorCode(
+    'LITERAL_WITH_CLASS',
+    "A {0} literal can't be prefixed by '{1}'.",
+    correction: "Try removing '{1}'",
+  );
 
-  static const ParserErrorCode LITERAL_WITH_CLASS_AND_NEW =
-      _LITERAL_WITH_CLASS_AND_NEW;
+  static const ParserErrorCode LITERAL_WITH_CLASS_AND_NEW = ParserErrorCode(
+    'LITERAL_WITH_CLASS_AND_NEW',
+    "A {0} literal can't be prefixed by 'new {1}'.",
+    correction: "Try removing 'new' and '{1}'",
+  );
 
-  static const ParserErrorCode LITERAL_WITH_NEW = _LITERAL_WITH_NEW;
+  static const ParserErrorCode LITERAL_WITH_NEW = ParserErrorCode(
+    'LITERAL_WITH_NEW',
+    "A literal can't be prefixed by 'new'.",
+    correction: "Try removing 'new'",
+  );
 
   static const ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER =
       ParserErrorCode(
@@ -626,16 +1046,31 @@
     correction: "Try removing the modifier.",
   );
 
-  static const ParserErrorCode MEMBER_WITH_CLASS_NAME = _MEMBER_WITH_CLASS_NAME;
+  static const ParserErrorCode MEMBER_WITH_CLASS_NAME = ParserErrorCode(
+    'MEMBER_WITH_CLASS_NAME',
+    "A class member can't have the same name as the enclosing class.",
+    correction: "Try renaming the member.",
+  );
 
-  static const ParserErrorCode MISSING_ASSIGNABLE_SELECTOR =
-      _MISSING_ASSIGNABLE_SELECTOR;
+  static const ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = ParserErrorCode(
+    'MISSING_ASSIGNABLE_SELECTOR',
+    "Missing selector such as '.identifier' or '[0]'.",
+    correction: "Try adding a selector.",
+  );
 
   static const ParserErrorCode MISSING_ASSIGNMENT_IN_INITIALIZER =
-      _MISSING_ASSIGNMENT_IN_INITIALIZER;
+      ParserErrorCode(
+    'MISSING_ASSIGNMENT_IN_INITIALIZER',
+    "Expected an assignment after the field name.",
+    correction: "To initialize a field, use the syntax 'name = value'.",
+  );
 
-  static const ParserErrorCode MISSING_CATCH_OR_FINALLY =
-      _MISSING_CATCH_OR_FINALLY;
+  static const ParserErrorCode MISSING_CATCH_OR_FINALLY = ParserErrorCode(
+    'MISSING_CATCH_OR_FINALLY',
+    "A try block must be followed by an 'on', 'catch', or 'finally' clause.",
+    correction:
+        "Try adding either a catch or finally clause, or remove the try statement.",
+  );
 
   static const ParserErrorCode MISSING_CLOSING_PARENTHESIS = ParserErrorCode(
     'MISSING_CLOSING_PARENTHESIS',
@@ -644,7 +1079,12 @@
   );
 
   static const ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE =
-      _MISSING_CONST_FINAL_VAR_OR_TYPE;
+      ParserErrorCode(
+    'MISSING_CONST_FINAL_VAR_OR_TYPE',
+    "Variables must be declared using the keywords 'const', 'final', 'var' or a type name.",
+    correction:
+        "Try adding the name of the type of the variable or the keyword 'var'.",
+  );
 
   static const ParserErrorCode MISSING_ENUM_BODY = ParserErrorCode(
     'MISSING_ENUM_BODY',
@@ -660,8 +1100,12 @@
         "Try adding the value to be assigned, or remove the assignment operator.",
   );
 
-  static const ParserErrorCode MISSING_EXPRESSION_IN_THROW =
-      _MISSING_EXPRESSION_IN_THROW;
+  static const ParserErrorCode MISSING_EXPRESSION_IN_THROW = ParserErrorCode(
+    'MISSING_EXPRESSION_IN_THROW',
+    "Missing expression after 'throw'.",
+    correction:
+        "Add an expression after 'throw' or use 'rethrow' to throw a caught exception",
+  );
 
   static const ParserErrorCode MISSING_FUNCTION_BODY = ParserErrorCode(
     'MISSING_FUNCTION_BODY',
@@ -692,10 +1136,16 @@
     "Expected an identifier.",
   );
 
-  static const ParserErrorCode MISSING_INITIALIZER = _MISSING_INITIALIZER;
+  static const ParserErrorCode MISSING_INITIALIZER = ParserErrorCode(
+    'MISSING_INITIALIZER',
+    "Expected an initializer.",
+  );
 
-  static const ParserErrorCode MISSING_KEYWORD_OPERATOR =
-      _MISSING_KEYWORD_OPERATOR;
+  static const ParserErrorCode MISSING_KEYWORD_OPERATOR = ParserErrorCode(
+    'MISSING_KEYWORD_OPERATOR',
+    "Operator declarations must be preceded by the keyword 'operator'.",
+    correction: "Try adding the keyword 'operator'.",
+  );
 
   static const ParserErrorCode MISSING_METHOD_PARAMETERS = ParserErrorCode(
     'MISSING_METHOD_PARAMETERS',
@@ -727,7 +1177,11 @@
   );
 
   static const ParserErrorCode MISSING_PREFIX_IN_DEFERRED_IMPORT =
-      _MISSING_PREFIX_IN_DEFERRED_IMPORT;
+      ParserErrorCode(
+    'MISSING_PREFIX_IN_DEFERRED_IMPORT',
+    "Deferred imports should have a prefix.",
+    correction: "Try adding a prefix to the import by adding an 'as' clause.",
+  );
 
   static const ParserErrorCode MISSING_STAR_AFTER_SYNC = ParserErrorCode(
     'MISSING_STAR_AFTER_SYNC',
@@ -735,7 +1189,10 @@
     correction: "Try removing the modifier, or add a star.",
   );
 
-  static const ParserErrorCode MISSING_STATEMENT = _MISSING_STATEMENT;
+  static const ParserErrorCode MISSING_STATEMENT = ParserErrorCode(
+    'MISSING_STATEMENT',
+    "Expected a statement.",
+  );
 
   /**
    * Parameters:
@@ -766,13 +1223,23 @@
     correction: "Try choosing a single style of optional parameters.",
   );
 
-  static const ParserErrorCode MIXIN_DECLARES_CONSTRUCTOR =
-      _MIXIN_DECLARES_CONSTRUCTOR;
+  static const ParserErrorCode MIXIN_DECLARES_CONSTRUCTOR = ParserErrorCode(
+    'MIXIN_DECLARES_CONSTRUCTOR',
+    "Mixins can't declare constructors.",
+  );
 
-  static const ParserErrorCode MODIFIER_OUT_OF_ORDER = _MODIFIER_OUT_OF_ORDER;
+  static const ParserErrorCode MODIFIER_OUT_OF_ORDER = ParserErrorCode(
+    'MODIFIER_OUT_OF_ORDER',
+    "The modifier '{0}' should be before the modifier '{1}'.",
+    correction: "Try re-ordering the modifiers.",
+  );
 
-  static const ParserErrorCode MULTIPLE_EXTENDS_CLAUSES =
-      _MULTIPLE_EXTENDS_CLAUSES;
+  static const ParserErrorCode MULTIPLE_EXTENDS_CLAUSES = ParserErrorCode(
+    'MULTIPLE_EXTENDS_CLAUSES',
+    "Each class definition can have at most one extends clause.",
+    correction:
+        "Try choosing one superclass and define your class to implement (or mix in) the others.",
+  );
 
   static const ParserErrorCode MULTIPLE_IMPLEMENTS_CLAUSES = ParserErrorCode(
     'MULTIPLE_IMPLEMENTS_CLAUSES',
@@ -781,8 +1248,11 @@
         "Try combining all of the implements clauses into a single clause.",
   );
 
-  static const ParserErrorCode MULTIPLE_LIBRARY_DIRECTIVES =
-      _MULTIPLE_LIBRARY_DIRECTIVES;
+  static const ParserErrorCode MULTIPLE_LIBRARY_DIRECTIVES = ParserErrorCode(
+    'MULTIPLE_LIBRARY_DIRECTIVES',
+    "Only one library directive may be declared in a file.",
+    correction: "Try removing all but one of the library directives.",
+  );
 
   static const ParserErrorCode MULTIPLE_NAMED_PARAMETER_GROUPS =
       ParserErrorCode(
@@ -791,10 +1261,17 @@
     correction: "Try combining all of the groups into a single group.",
   );
 
-  static const ParserErrorCode MULTIPLE_ON_CLAUSES = _MULTIPLE_ON_CLAUSES;
+  static const ParserErrorCode MULTIPLE_ON_CLAUSES = ParserErrorCode(
+    'MULTIPLE_ON_CLAUSES',
+    "Each mixin definition can have at most one on clause.",
+    correction: "Try combining all of the on clauses into a single clause.",
+  );
 
-  static const ParserErrorCode MULTIPLE_PART_OF_DIRECTIVES =
-      _MULTIPLE_PART_OF_DIRECTIVES;
+  static const ParserErrorCode MULTIPLE_PART_OF_DIRECTIVES = ParserErrorCode(
+    'MULTIPLE_PART_OF_DIRECTIVES',
+    "Only one part-of directive may be declared in a file.",
+    correction: "Try removing all but one of the part-of directives.",
+  );
 
   static const ParserErrorCode MULTIPLE_POSITIONAL_PARAMETER_GROUPS =
       ParserErrorCode(
@@ -814,10 +1291,17 @@
         "Try moving all but one of the declarations inside the loop body.",
   );
 
-  static const ParserErrorCode MULTIPLE_VARIANCE_MODIFIERS =
-      _MULTIPLE_VARIANCE_MODIFIERS;
+  static const ParserErrorCode MULTIPLE_VARIANCE_MODIFIERS = ParserErrorCode(
+    'MULTIPLE_VARIANCE_MODIFIERS',
+    "Each type parameter can have at most one variance modifier.",
+    correction: "Use at most one of the 'in', 'out', or 'inout' modifiers.",
+  );
 
-  static const ParserErrorCode MULTIPLE_WITH_CLAUSES = _MULTIPLE_WITH_CLAUSES;
+  static const ParserErrorCode MULTIPLE_WITH_CLAUSES = ParserErrorCode(
+    'MULTIPLE_WITH_CLAUSES',
+    "Each class definition can have at most one with clause.",
+    correction: "Try combining all of the with clauses into a single clause.",
+  );
 
   static const ParserErrorCode NAMED_FUNCTION_EXPRESSION = ParserErrorCode(
     'NAMED_FUNCTION_EXPRESSION',
@@ -845,7 +1329,12 @@
   );
 
   static const ParserErrorCode NATIVE_CLAUSE_SHOULD_BE_ANNOTATION =
-      _NATIVE_CLAUSE_SHOULD_BE_ANNOTATION;
+      ParserErrorCode(
+    'NATIVE_CLAUSE_SHOULD_BE_ANNOTATION',
+    "Native clause in this form is deprecated.",
+    correction:
+        "Try removing this native clause and adding @native() or @native('native-name') before the declaration.",
+  );
 
   static const ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE =
       ParserErrorCode(
@@ -897,7 +1386,12 @@
   );
 
   static const ParserErrorCode NULL_AWARE_CASCADE_OUT_OF_ORDER =
-      _NULL_AWARE_CASCADE_OUT_OF_ORDER;
+      ParserErrorCode(
+    'NULL_AWARE_CASCADE_OUT_OF_ORDER',
+    "The '?..' cascade operator must be first in the cascade sequence.",
+    correction:
+        "Try moving the '?..' operator to be the first cascade operator in the sequence.",
+  );
 
   static const ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT =
       ParserErrorCode(
@@ -914,16 +1408,33 @@
     correction: "Try surrounding the positional parameters in square brackets.",
   );
 
-  static const ParserErrorCode PREFIX_AFTER_COMBINATOR =
-      _PREFIX_AFTER_COMBINATOR;
+  static const ParserErrorCode PREFIX_AFTER_COMBINATOR = ParserErrorCode(
+    'PREFIX_AFTER_COMBINATOR',
+    "The prefix ('as' clause) should come before any show/hide combinators.",
+    correction: "Try moving the prefix before the combinators.",
+  );
 
   static const ParserErrorCode REDIRECTING_CONSTRUCTOR_WITH_BODY =
-      _REDIRECTING_CONSTRUCTOR_WITH_BODY;
+      ParserErrorCode(
+    'REDIRECTING_CONSTRUCTOR_WITH_BODY',
+    "Redirecting constructors can't have a body.",
+    correction:
+        "Try removing the body, or not making this a redirecting constructor.",
+  );
 
   static const ParserErrorCode REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR =
-      _REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR;
+      ParserErrorCode(
+    'REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR',
+    "Only factory constructor can specify '=' redirection.",
+    correction:
+        "Try making this a factory constructor, or remove the redirection.",
+  );
 
-  static const ParserErrorCode SETTER_CONSTRUCTOR = _SETTER_CONSTRUCTOR;
+  static const ParserErrorCode SETTER_CONSTRUCTOR = ParserErrorCode(
+    'SETTER_CONSTRUCTOR',
+    "Constructors can't be a setter.",
+    correction: "Try removing 'set'.",
+  );
 
   static const ParserErrorCode SETTER_IN_FUNCTION = ParserErrorCode(
     'SETTER_IN_FUNCTION',
@@ -931,9 +1442,17 @@
     correction: "Try moving the setter outside the method or function.",
   );
 
-  static const ParserErrorCode STACK_OVERFLOW = _STACK_OVERFLOW;
+  static const ParserErrorCode STACK_OVERFLOW = ParserErrorCode(
+    'STACK_OVERFLOW',
+    "The file has too many nested expressions or statements.",
+    correction: "Try simplifying the code.",
+  );
 
-  static const ParserErrorCode STATIC_CONSTRUCTOR = _STATIC_CONSTRUCTOR;
+  static const ParserErrorCode STATIC_CONSTRUCTOR = ParserErrorCode(
+    'STATIC_CONSTRUCTOR',
+    "Constructors can't be static.",
+    correction: "Try removing the keyword 'static'.",
+  );
 
   static const ParserErrorCode STATIC_GETTER_WITHOUT_BODY = ParserErrorCode(
     'STATIC_GETTER_WITHOUT_BODY',
@@ -942,7 +1461,11 @@
         "Try adding a body to the getter, or removing the keyword 'static'.",
   );
 
-  static const ParserErrorCode STATIC_OPERATOR = _STATIC_OPERATOR;
+  static const ParserErrorCode STATIC_OPERATOR = ParserErrorCode(
+    'STATIC_OPERATOR',
+    "Operators can't be static.",
+    correction: "Try removing the keyword 'static'.",
+  );
 
   static const ParserErrorCode STATIC_SETTER_WITHOUT_BODY = ParserErrorCode(
     'STATIC_SETTER_WITHOUT_BODY',
@@ -958,22 +1481,50 @@
   );
 
   static const ParserErrorCode SWITCH_HAS_CASE_AFTER_DEFAULT_CASE =
-      _SWITCH_HAS_CASE_AFTER_DEFAULT_CASE;
+      ParserErrorCode(
+    'SWITCH_HAS_CASE_AFTER_DEFAULT_CASE',
+    "The default case should be the last case in a switch statement.",
+    correction: "Try moving the default case after the other case clauses.",
+  );
 
   static const ParserErrorCode SWITCH_HAS_MULTIPLE_DEFAULT_CASES =
-      _SWITCH_HAS_MULTIPLE_DEFAULT_CASES;
+      ParserErrorCode(
+    'SWITCH_HAS_MULTIPLE_DEFAULT_CASES',
+    "The 'default' case can only be declared once.",
+    correction: "Try removing all but one default case.",
+  );
 
-  static const ParserErrorCode TOP_LEVEL_OPERATOR = _TOP_LEVEL_OPERATOR;
+  static const ParserErrorCode TOP_LEVEL_OPERATOR = ParserErrorCode(
+    'TOP_LEVEL_OPERATOR',
+    "Operators must be declared within a class.",
+    correction:
+        "Try removing the operator, moving it to a class, or converting it to be a function.",
+  );
 
-  static const ParserErrorCode TYPEDEF_IN_CLASS = _TYPEDEF_IN_CLASS;
+  static const ParserErrorCode TYPEDEF_IN_CLASS = ParserErrorCode(
+    'TYPEDEF_IN_CLASS',
+    "Typedefs can't be declared inside classes.",
+    correction: "Try moving the typedef to the top-level.",
+  );
 
   static const ParserErrorCode TYPE_ARGUMENTS_ON_TYPE_VARIABLE =
-      _TYPE_ARGUMENTS_ON_TYPE_VARIABLE;
+      ParserErrorCode(
+    'TYPE_ARGUMENTS_ON_TYPE_VARIABLE',
+    "Can't use type arguments with type variable '{0}'.",
+    correction: "Try removing the type arguments.",
+  );
 
-  static const ParserErrorCode TYPE_BEFORE_FACTORY = _TYPE_BEFORE_FACTORY;
+  static const ParserErrorCode TYPE_BEFORE_FACTORY = ParserErrorCode(
+    'TYPE_BEFORE_FACTORY',
+    "Factory constructors cannot have a return type.",
+    correction: "Try removing the type appearing before 'factory'.",
+  );
 
-  static const ParserErrorCode TYPE_PARAMETER_ON_CONSTRUCTOR =
-      _TYPE_PARAMETER_ON_CONSTRUCTOR;
+  static const ParserErrorCode TYPE_PARAMETER_ON_CONSTRUCTOR = ParserErrorCode(
+    'TYPE_PARAMETER_ON_CONSTRUCTOR',
+    "Constructors can't have type parameters.",
+    correction: "Try removing the type parameters.",
+  );
 
   /**
    * 7.1.1 Operators: Type parameters are not syntactically supported on an
@@ -1006,9 +1557,16 @@
     correction: "Try removing the text.",
   );
 
-  static const ParserErrorCode VAR_AND_TYPE = _VAR_AND_TYPE;
+  static const ParserErrorCode VAR_AND_TYPE = ParserErrorCode(
+    'VAR_AND_TYPE',
+    "Variables can't be declared using both 'var' and a type name.",
+    correction: "Try removing 'var.'",
+  );
 
-  static const ParserErrorCode VAR_AS_TYPE_NAME = _VAR_AS_TYPE_NAME;
+  static const ParserErrorCode VAR_AS_TYPE_NAME = ParserErrorCode(
+    'VAR_AS_TYPE_NAME',
+    "The keyword 'var' can't be used as a type name.",
+  );
 
   static const ParserErrorCode VAR_CLASS = ParserErrorCode(
     'VAR_CLASS',
@@ -1022,7 +1580,12 @@
     correction: "Try removing the keyword 'var'.",
   );
 
-  static const ParserErrorCode VAR_RETURN_TYPE = _VAR_RETURN_TYPE;
+  static const ParserErrorCode VAR_RETURN_TYPE = ParserErrorCode(
+    'VAR_RETURN_TYPE',
+    "The return type can't be 'var'.",
+    correction:
+        "Try removing the keyword 'var', or replacing it with the name of the return type.",
+  );
 
   static const ParserErrorCode VAR_TYPEDEF = ParserErrorCode(
     'VAR_TYPEDEF',
@@ -1031,10 +1594,17 @@
         "Try removing the keyword 'var', or replacing it with the name of the return type.",
   );
 
-  static const ParserErrorCode VOID_WITH_TYPE_ARGUMENTS =
-      _VOID_WITH_TYPE_ARGUMENTS;
+  static const ParserErrorCode VOID_WITH_TYPE_ARGUMENTS = ParserErrorCode(
+    'VOID_WITH_TYPE_ARGUMENTS',
+    "Type 'void' can't have type arguments.",
+    correction: "Try removing the type arguments.",
+  );
 
-  static const ParserErrorCode WITH_BEFORE_EXTENDS = _WITH_BEFORE_EXTENDS;
+  static const ParserErrorCode WITH_BEFORE_EXTENDS = ParserErrorCode(
+    'WITH_BEFORE_EXTENDS',
+    "The extends clause must be before the with clause.",
+    correction: "Try moving the extends clause before the with clause.",
+  );
 
   static const ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER =
       ParserErrorCode(
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
deleted file mode 100644
index 4db09fe..0000000
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
+++ /dev/null
@@ -1,851 +0,0 @@
-//
-// THIS FILE IS GENERATED. DO NOT EDIT.
-//
-// Instead modify 'pkg/front_end/messages.yaml' and run
-// 'dart pkg/analyzer/tool/messages/generate.dart' to update.
-
-part of 'syntactic_errors.analyzer.g.dart';
-
-final fastaAnalyzerErrorCodes = <ErrorCode?>[
-  null,
-  _EQUALITY_CANNOT_BE_EQUALITY_OPERAND,
-  _CONTINUE_OUTSIDE_OF_LOOP,
-  _EXTERNAL_CLASS,
-  _STATIC_CONSTRUCTOR,
-  _EXTERNAL_ENUM,
-  _PREFIX_AFTER_COMBINATOR,
-  _TYPEDEF_IN_CLASS,
-  _EXPECTED_BODY,
-  _INVALID_AWAIT_IN_FOR,
-  _IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE,
-  _WITH_BEFORE_EXTENDS,
-  _VAR_RETURN_TYPE,
-  _TYPE_ARGUMENTS_ON_TYPE_VARIABLE,
-  _TOP_LEVEL_OPERATOR,
-  _SWITCH_HAS_MULTIPLE_DEFAULT_CASES,
-  _SWITCH_HAS_CASE_AFTER_DEFAULT_CASE,
-  _STATIC_OPERATOR,
-  _INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER,
-  _STACK_OVERFLOW,
-  _MISSING_CATCH_OR_FINALLY,
-  _REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR,
-  _REDIRECTING_CONSTRUCTOR_WITH_BODY,
-  _NATIVE_CLAUSE_SHOULD_BE_ANNOTATION,
-  _MULTIPLE_WITH_CLAUSES,
-  _MULTIPLE_PART_OF_DIRECTIVES,
-  _MULTIPLE_ON_CLAUSES,
-  _MULTIPLE_LIBRARY_DIRECTIVES,
-  _MULTIPLE_EXTENDS_CLAUSES,
-  _MISSING_STATEMENT,
-  _MISSING_PREFIX_IN_DEFERRED_IMPORT,
-  _MISSING_KEYWORD_OPERATOR,
-  _MISSING_EXPRESSION_IN_THROW,
-  _MISSING_CONST_FINAL_VAR_OR_TYPE,
-  _MISSING_ASSIGNMENT_IN_INITIALIZER,
-  _MISSING_ASSIGNABLE_SELECTOR,
-  _MISSING_INITIALIZER,
-  _LIBRARY_DIRECTIVE_NOT_FIRST,
-  _INVALID_UNICODE_ESCAPE,
-  _INVALID_OPERATOR,
-  _INVALID_HEX_ESCAPE,
-  _EXPECTED_INSTEAD,
-  _IMPLEMENTS_BEFORE_WITH,
-  _IMPLEMENTS_BEFORE_ON,
-  _IMPLEMENTS_BEFORE_EXTENDS,
-  _ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE,
-  _EXPECTED_ELSE_OR_COMMA,
-  _INVALID_SUPER_IN_INITIALIZER,
-  _EXPERIMENT_NOT_ENABLED,
-  _EXTERNAL_METHOD_WITH_BODY,
-  _EXTERNAL_FIELD,
-  _ABSTRACT_CLASS_MEMBER,
-  _BREAK_OUTSIDE_OF_LOOP,
-  _CLASS_IN_CLASS,
-  _COLON_IN_PLACE_OF_IN,
-  _CONSTRUCTOR_WITH_RETURN_TYPE,
-  _MODIFIER_OUT_OF_ORDER,
-  _TYPE_BEFORE_FACTORY,
-  _CONST_AND_FINAL,
-  _CONFLICTING_MODIFIERS,
-  _CONST_CLASS,
-  _VAR_AS_TYPE_NAME,
-  _CONST_FACTORY,
-  _CONST_METHOD,
-  _CONTINUE_WITHOUT_LABEL_IN_CASE,
-  _INVALID_THIS_IN_INITIALIZER,
-  _COVARIANT_AND_STATIC,
-  _COVARIANT_MEMBER,
-  _DEFERRED_AFTER_PREFIX,
-  _DIRECTIVE_AFTER_DECLARATION,
-  _DUPLICATED_MODIFIER,
-  _DUPLICATE_DEFERRED,
-  _DUPLICATE_LABEL_IN_SWITCH_STATEMENT,
-  _DUPLICATE_PREFIX,
-  _ENUM_IN_CLASS,
-  _EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE,
-  _EXTERNAL_TYPEDEF,
-  _EXTRANEOUS_MODIFIER,
-  _FACTORY_TOP_LEVEL_DECLARATION,
-  _FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
-  _FINAL_AND_COVARIANT,
-  _FINAL_AND_VAR,
-  _INITIALIZED_VARIABLE_IN_FOR_EACH,
-  _CATCH_SYNTAX_EXTRA_PARAMETERS,
-  _CATCH_SYNTAX,
-  _EXTERNAL_FACTORY_REDIRECTION,
-  _EXTERNAL_FACTORY_WITH_BODY,
-  _EXTERNAL_CONSTRUCTOR_WITH_BODY,
-  _FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS,
-  _VAR_AND_TYPE,
-  _INVALID_INITIALIZER,
-  _ANNOTATION_WITH_TYPE_ARGUMENTS,
-  _EXTENSION_DECLARES_CONSTRUCTOR,
-  _EXTENSION_DECLARES_INSTANCE_FIELD,
-  _EXTENSION_DECLARES_ABSTRACT_MEMBER,
-  _MIXIN_DECLARES_CONSTRUCTOR,
-  _NULL_AWARE_CASCADE_OUT_OF_ORDER,
-  _MULTIPLE_VARIANCE_MODIFIERS,
-  _INVALID_USE_OF_COVARIANT_IN_EXTENSION,
-  _TYPE_PARAMETER_ON_CONSTRUCTOR,
-  _VOID_WITH_TYPE_ARGUMENTS,
-  _FINAL_AND_COVARIANT_LATE_WITH_INITIALIZER,
-  _INVALID_CONSTRUCTOR_NAME,
-  _GETTER_CONSTRUCTOR,
-  _SETTER_CONSTRUCTOR,
-  _MEMBER_WITH_CLASS_NAME,
-  _EXTERNAL_CONSTRUCTOR_WITH_INITIALIZER,
-  _ABSTRACT_STATIC_FIELD,
-  _ABSTRACT_LATE_FIELD,
-  _EXTERNAL_LATE_FIELD,
-  _ABSTRACT_EXTERNAL_FIELD,
-  _ANNOTATION_ON_TYPE_ARGUMENT,
-  _BINARY_OPERATOR_WRITTEN_OUT,
-  _EXPECTED_IDENTIFIER_BUT_GOT_KEYWORD,
-  _ANNOTATION_WITH_TYPE_ARGUMENTS_UNINSTANTIATED,
-  _LITERAL_WITH_CLASS_AND_NEW,
-  _LITERAL_WITH_CLASS,
-  _LITERAL_WITH_NEW,
-  _CONSTRUCTOR_WITH_TYPE_ARGUMENTS,
-];
-
-const ParserErrorCode _ABSTRACT_CLASS_MEMBER = ParserErrorCode(
-  'ABSTRACT_CLASS_MEMBER',
-  "Members of classes can't be declared to be 'abstract'.",
-  correction:
-      "Try removing the 'abstract' keyword. You can add the 'abstract' keyword before the class declaration.",
-);
-
-const ParserErrorCode _ABSTRACT_EXTERNAL_FIELD = ParserErrorCode(
-  'ABSTRACT_EXTERNAL_FIELD',
-  "Fields can't be declared both 'abstract' and 'external'.",
-  correction: "Try removing the 'abstract' or 'external' keyword.",
-);
-
-const ParserErrorCode _ABSTRACT_LATE_FIELD = ParserErrorCode(
-  'ABSTRACT_LATE_FIELD',
-  "Abstract fields cannot be late.",
-  correction: "Try removing the 'abstract' or 'late' keyword.",
-);
-
-const ParserErrorCode _ABSTRACT_STATIC_FIELD = ParserErrorCode(
-  'ABSTRACT_STATIC_FIELD',
-  "Static fields can't be declared 'abstract'.",
-  correction: "Try removing the 'abstract' or 'static' keyword.",
-);
-
-const ParserErrorCode _ANNOTATION_ON_TYPE_ARGUMENT = ParserErrorCode(
-  'ANNOTATION_ON_TYPE_ARGUMENT',
-  "Type arguments can't have annotations because they aren't declarations.",
-);
-
-const ParserErrorCode _ANNOTATION_WITH_TYPE_ARGUMENTS = ParserErrorCode(
-  'ANNOTATION_WITH_TYPE_ARGUMENTS',
-  "An annotation can't use type arguments.",
-);
-
-const ParserErrorCode _ANNOTATION_WITH_TYPE_ARGUMENTS_UNINSTANTIATED =
-    ParserErrorCode(
-  'ANNOTATION_WITH_TYPE_ARGUMENTS_UNINSTANTIATED',
-  "An annotation with type arguments must be followed by an argument list.",
-);
-
-const ParserErrorCode _BINARY_OPERATOR_WRITTEN_OUT = ParserErrorCode(
-  'BINARY_OPERATOR_WRITTEN_OUT',
-  "Binary operator '{0}' is written as '{1}' instead of the written out word.",
-  correction: "Try replacing '{0}' with '{1}'.",
-);
-
-const ParserErrorCode _BREAK_OUTSIDE_OF_LOOP = ParserErrorCode(
-  'BREAK_OUTSIDE_OF_LOOP',
-  "A break statement can't be used outside of a loop or switch statement.",
-  correction: "Try removing the break statement.",
-);
-
-const ParserErrorCode _CATCH_SYNTAX = ParserErrorCode(
-  'CATCH_SYNTAX',
-  "'catch' must be followed by '(identifier)' or '(identifier, identifier)'.",
-  correction:
-      "No types are needed, the first is given by 'on', the second is always 'StackTrace'.",
-);
-
-const ParserErrorCode _CATCH_SYNTAX_EXTRA_PARAMETERS = ParserErrorCode(
-  'CATCH_SYNTAX_EXTRA_PARAMETERS',
-  "'catch' must be followed by '(identifier)' or '(identifier, identifier)'.",
-  correction:
-      "No types are needed, the first is given by 'on', the second is always 'StackTrace'.",
-);
-
-const ParserErrorCode _CLASS_IN_CLASS = ParserErrorCode(
-  'CLASS_IN_CLASS',
-  "Classes can't be declared inside other classes.",
-  correction: "Try moving the class to the top-level.",
-);
-
-const ParserErrorCode _COLON_IN_PLACE_OF_IN = ParserErrorCode(
-  'COLON_IN_PLACE_OF_IN',
-  "For-in loops use 'in' rather than a colon.",
-  correction: "Try replacing the colon with the keyword 'in'.",
-);
-
-const ParserErrorCode _CONFLICTING_MODIFIERS = ParserErrorCode(
-  'CONFLICTING_MODIFIERS',
-  "Members can't be declared to be both '{0}' and '{1}'.",
-  correction: "Try removing one of the keywords.",
-);
-
-const ParserErrorCode _CONSTRUCTOR_WITH_RETURN_TYPE = ParserErrorCode(
-  'CONSTRUCTOR_WITH_RETURN_TYPE',
-  "Constructors can't have a return type.",
-  correction: "Try removing the return type.",
-);
-
-const ParserErrorCode _CONSTRUCTOR_WITH_TYPE_ARGUMENTS = ParserErrorCode(
-  'CONSTRUCTOR_WITH_TYPE_ARGUMENTS',
-  "A constructor invocation can't have type arguments after the constructor name.",
-  correction:
-      "Try removing the type arguments or placing them after the class name.",
-);
-
-const ParserErrorCode _CONST_AND_FINAL = ParserErrorCode(
-  'CONST_AND_FINAL',
-  "Members can't be declared to be both 'const' and 'final'.",
-  correction: "Try removing either the 'const' or 'final' keyword.",
-);
-
-const ParserErrorCode _CONST_CLASS = ParserErrorCode(
-  'CONST_CLASS',
-  "Classes can't be declared to be 'const'.",
-  correction:
-      "Try removing the 'const' keyword. If you're trying to indicate that instances of the class can be constants, place the 'const' keyword on  the class' constructor(s).",
-);
-
-const ParserErrorCode _CONST_FACTORY = ParserErrorCode(
-  'CONST_FACTORY',
-  "Only redirecting factory constructors can be declared to be 'const'.",
-  correction:
-      "Try removing the 'const' keyword, or replacing the body with '=' followed by a valid target.",
-);
-
-const ParserErrorCode _CONST_METHOD = ParserErrorCode(
-  'CONST_METHOD',
-  "Getters, setters and methods can't be declared to be 'const'.",
-  correction: "Try removing the 'const' keyword.",
-);
-
-const ParserErrorCode _CONTINUE_OUTSIDE_OF_LOOP = ParserErrorCode(
-  'CONTINUE_OUTSIDE_OF_LOOP',
-  "A continue statement can't be used outside of a loop or switch statement.",
-  correction: "Try removing the continue statement.",
-);
-
-const ParserErrorCode _CONTINUE_WITHOUT_LABEL_IN_CASE = ParserErrorCode(
-  'CONTINUE_WITHOUT_LABEL_IN_CASE',
-  "A continue statement in a switch statement must have a label as a target.",
-  correction:
-      "Try adding a label associated with one of the case clauses to the continue statement.",
-);
-
-const ParserErrorCode _COVARIANT_AND_STATIC = ParserErrorCode(
-  'COVARIANT_AND_STATIC',
-  "Members can't be declared to be both 'covariant' and 'static'.",
-  correction: "Try removing either the 'covariant' or 'static' keyword.",
-);
-
-const ParserErrorCode _COVARIANT_MEMBER = ParserErrorCode(
-  'COVARIANT_MEMBER',
-  "Getters, setters and methods can't be declared to be 'covariant'.",
-  correction: "Try removing the 'covariant' keyword.",
-);
-
-const ParserErrorCode _DEFERRED_AFTER_PREFIX = ParserErrorCode(
-  'DEFERRED_AFTER_PREFIX',
-  "The deferred keyword should come immediately before the prefix ('as' clause).",
-  correction: "Try moving the deferred keyword before the prefix.",
-);
-
-const ParserErrorCode _DIRECTIVE_AFTER_DECLARATION = ParserErrorCode(
-  'DIRECTIVE_AFTER_DECLARATION',
-  "Directives must appear before any declarations.",
-  correction: "Try moving the directive before any declarations.",
-);
-
-const ParserErrorCode _DUPLICATED_MODIFIER = ParserErrorCode(
-  'DUPLICATED_MODIFIER',
-  "The modifier '{0}' was already specified.",
-  correction: "Try removing all but one occurrence of the modifier.",
-);
-
-const ParserErrorCode _DUPLICATE_DEFERRED = ParserErrorCode(
-  'DUPLICATE_DEFERRED',
-  "An import directive can only have one 'deferred' keyword.",
-  correction: "Try removing all but one 'deferred' keyword.",
-);
-
-const ParserErrorCode _DUPLICATE_LABEL_IN_SWITCH_STATEMENT = ParserErrorCode(
-  'DUPLICATE_LABEL_IN_SWITCH_STATEMENT',
-  "The label '{0}' was already used in this switch statement.",
-  correction: "Try choosing a different name for this label.",
-);
-
-const ParserErrorCode _DUPLICATE_PREFIX = ParserErrorCode(
-  'DUPLICATE_PREFIX',
-  "An import directive can only have one prefix ('as' clause).",
-  correction: "Try removing all but one prefix.",
-);
-
-const ParserErrorCode _ENUM_IN_CLASS = ParserErrorCode(
-  'ENUM_IN_CLASS',
-  "Enums can't be declared inside classes.",
-  correction: "Try moving the enum to the top-level.",
-);
-
-const ParserErrorCode _EQUALITY_CANNOT_BE_EQUALITY_OPERAND = ParserErrorCode(
-  'EQUALITY_CANNOT_BE_EQUALITY_OPERAND',
-  "A comparison expression can't be an operand of another comparison expression.",
-  correction: "Try putting parentheses around one of the comparisons.",
-);
-
-const ParserErrorCode _EXPECTED_BODY = ParserErrorCode(
-  'EXPECTED_BODY',
-  "A {0} must have a body, even if it is empty.",
-  correction: "Try adding an empty body.",
-);
-
-const ParserErrorCode _EXPECTED_ELSE_OR_COMMA = ParserErrorCode(
-  'EXPECTED_ELSE_OR_COMMA',
-  "Expected 'else' or comma.",
-);
-
-const ParserErrorCode _EXPECTED_IDENTIFIER_BUT_GOT_KEYWORD = ParserErrorCode(
-  'EXPECTED_IDENTIFIER_BUT_GOT_KEYWORD',
-  "'{0}' can't be used as an identifier because it's a keyword.",
-  correction: "Try renaming this to be an identifier that isn't a keyword.",
-);
-
-const ParserErrorCode _EXPECTED_INSTEAD = ParserErrorCode(
-  'EXPECTED_INSTEAD',
-  "Expected '{0}' instead of this.",
-);
-
-const ParserErrorCode _EXPERIMENT_NOT_ENABLED = ParserErrorCode(
-  'EXPERIMENT_NOT_ENABLED',
-  "This requires the '{0}' language feature to be enabled.",
-  correction:
-      "Try updating your pubspec.yaml to set the minimum SDK constraint to {1} or higher, and running 'pub get'.",
-);
-
-const ParserErrorCode _EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = ParserErrorCode(
-  'EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE',
-  "Export directives must precede part directives.",
-  correction: "Try moving the export directives before the part directives.",
-);
-
-const ParserErrorCode _EXTENSION_DECLARES_ABSTRACT_MEMBER = ParserErrorCode(
-  'EXTENSION_DECLARES_ABSTRACT_MEMBER',
-  "Extensions can't declare abstract members.",
-  correction: "Try providing an implementation for the member.",
-  hasPublishedDocs: true,
-);
-
-const ParserErrorCode _EXTENSION_DECLARES_CONSTRUCTOR = ParserErrorCode(
-  'EXTENSION_DECLARES_CONSTRUCTOR',
-  "Extensions can't declare constructors.",
-  correction: "Try removing the constructor declaration.",
-  hasPublishedDocs: true,
-);
-
-const ParserErrorCode _EXTENSION_DECLARES_INSTANCE_FIELD = ParserErrorCode(
-  'EXTENSION_DECLARES_INSTANCE_FIELD',
-  "Extensions can't declare instance fields",
-  correction: "Try removing the field declaration or making it a static field",
-  hasPublishedDocs: true,
-);
-
-const ParserErrorCode _EXTERNAL_CLASS = ParserErrorCode(
-  'EXTERNAL_CLASS',
-  "Classes can't be declared to be 'external'.",
-  correction: "Try removing the keyword 'external'.",
-);
-
-const ParserErrorCode _EXTERNAL_CONSTRUCTOR_WITH_BODY = ParserErrorCode(
-  'EXTERNAL_CONSTRUCTOR_WITH_BODY',
-  "External constructors can't have a body.",
-  correction:
-      "Try removing the body of the constructor, or removing the keyword 'external'.",
-);
-
-const ParserErrorCode _EXTERNAL_CONSTRUCTOR_WITH_INITIALIZER = ParserErrorCode(
-  'EXTERNAL_CONSTRUCTOR_WITH_INITIALIZER',
-  "An external constructor can't have any initializers.",
-);
-
-const ParserErrorCode _EXTERNAL_ENUM = ParserErrorCode(
-  'EXTERNAL_ENUM',
-  "Enums can't be declared to be 'external'.",
-  correction: "Try removing the keyword 'external'.",
-);
-
-const ParserErrorCode _EXTERNAL_FACTORY_REDIRECTION = ParserErrorCode(
-  'EXTERNAL_FACTORY_REDIRECTION',
-  "A redirecting factory can't be external.",
-  correction: "Try removing the 'external' modifier.",
-);
-
-const ParserErrorCode _EXTERNAL_FACTORY_WITH_BODY = ParserErrorCode(
-  'EXTERNAL_FACTORY_WITH_BODY',
-  "External factories can't have a body.",
-  correction:
-      "Try removing the body of the factory, or removing the keyword 'external'.",
-);
-
-const ParserErrorCode _EXTERNAL_FIELD = ParserErrorCode(
-  'EXTERNAL_FIELD',
-  "Fields can't be declared to be 'external'.",
-  correction:
-      "Try removing the keyword 'external', or replacing the field by an external getter and/or setter.",
-);
-
-const ParserErrorCode _EXTERNAL_LATE_FIELD = ParserErrorCode(
-  'EXTERNAL_LATE_FIELD',
-  "External fields cannot be late.",
-  correction: "Try removing the 'external' or 'late' keyword.",
-);
-
-const ParserErrorCode _EXTERNAL_METHOD_WITH_BODY = ParserErrorCode(
-  'EXTERNAL_METHOD_WITH_BODY',
-  "An external or native method can't have a body.",
-);
-
-const ParserErrorCode _EXTERNAL_TYPEDEF = ParserErrorCode(
-  'EXTERNAL_TYPEDEF',
-  "Typedefs can't be declared to be 'external'.",
-  correction: "Try removing the keyword 'external'.",
-);
-
-const ParserErrorCode _EXTRANEOUS_MODIFIER = ParserErrorCode(
-  'EXTRANEOUS_MODIFIER',
-  "Can't have modifier '{0}' here.",
-  correction: "Try removing '{0}'.",
-);
-
-const ParserErrorCode _FACTORY_TOP_LEVEL_DECLARATION = ParserErrorCode(
-  'FACTORY_TOP_LEVEL_DECLARATION',
-  "Top-level declarations can't be declared to be 'factory'.",
-  correction: "Try removing the keyword 'factory'.",
-);
-
-const ParserErrorCode _FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS =
-    ParserErrorCode(
-  'FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS',
-  "A field can only be initialized in its declaring class",
-  correction:
-      "Try passing a value into the superclass constructor, or moving the initialization into the constructor body.",
-);
-
-const ParserErrorCode _FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = ParserErrorCode(
-  'FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR',
-  "Field formal parameters can only be used in a constructor.",
-  correction: "Try removing 'this.'.",
-);
-
-const ParserErrorCode _FINAL_AND_COVARIANT = ParserErrorCode(
-  'FINAL_AND_COVARIANT',
-  "Members can't be declared to be both 'final' and 'covariant'.",
-  correction: "Try removing either the 'final' or 'covariant' keyword.",
-);
-
-const ParserErrorCode _FINAL_AND_COVARIANT_LATE_WITH_INITIALIZER =
-    ParserErrorCode(
-  'FINAL_AND_COVARIANT_LATE_WITH_INITIALIZER',
-  "Members marked 'late' with an initializer can't be declared to be both 'final' and 'covariant'.",
-  correction:
-      "Try removing either the 'final' or 'covariant' keyword, or removing the initializer.",
-);
-
-const ParserErrorCode _FINAL_AND_VAR = ParserErrorCode(
-  'FINAL_AND_VAR',
-  "Members can't be declared to be both 'final' and 'var'.",
-  correction: "Try removing the keyword 'var'.",
-);
-
-const ParserErrorCode _GETTER_CONSTRUCTOR = ParserErrorCode(
-  'GETTER_CONSTRUCTOR',
-  "Constructors can't be a getter.",
-  correction: "Try removing 'get'.",
-);
-
-const ParserErrorCode _ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = ParserErrorCode(
-  'ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE',
-  "Illegal assignment to non-assignable expression.",
-);
-
-const ParserErrorCode _IMPLEMENTS_BEFORE_EXTENDS = ParserErrorCode(
-  'IMPLEMENTS_BEFORE_EXTENDS',
-  "The extends clause must be before the implements clause.",
-  correction: "Try moving the extends clause before the implements clause.",
-);
-
-const ParserErrorCode _IMPLEMENTS_BEFORE_ON = ParserErrorCode(
-  'IMPLEMENTS_BEFORE_ON',
-  "The on clause must be before the implements clause.",
-  correction: "Try moving the on clause before the implements clause.",
-);
-
-const ParserErrorCode _IMPLEMENTS_BEFORE_WITH = ParserErrorCode(
-  'IMPLEMENTS_BEFORE_WITH',
-  "The with clause must be before the implements clause.",
-  correction: "Try moving the with clause before the implements clause.",
-);
-
-const ParserErrorCode _IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = ParserErrorCode(
-  'IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE',
-  "Import directives must precede part directives.",
-  correction: "Try moving the import directives before the part directives.",
-);
-
-const ParserErrorCode _INITIALIZED_VARIABLE_IN_FOR_EACH = ParserErrorCode(
-  'INITIALIZED_VARIABLE_IN_FOR_EACH',
-  "The loop variable in a for-each loop can't be initialized.",
-  correction:
-      "Try removing the initializer, or using a different kind of loop.",
-);
-
-const ParserErrorCode _INVALID_AWAIT_IN_FOR = ParserErrorCode(
-  'INVALID_AWAIT_IN_FOR',
-  "The keyword 'await' isn't allowed for a normal 'for' statement.",
-  correction: "Try removing the keyword, or use a for-each statement.",
-);
-
-const ParserErrorCode _INVALID_CONSTRUCTOR_NAME = ParserErrorCode(
-  'INVALID_CONSTRUCTOR_NAME',
-  "The name of a constructor must match the name of the enclosing class.",
-);
-
-const ParserErrorCode _INVALID_HEX_ESCAPE = ParserErrorCode(
-  'INVALID_HEX_ESCAPE',
-  "An escape sequence starting with '\\x' must be followed by 2 hexadecimal digits.",
-);
-
-const ParserErrorCode _INVALID_INITIALIZER = ParserErrorCode(
-  'INVALID_INITIALIZER',
-  "Not a valid initializer.",
-  correction: "To initialize a field, use the syntax 'name = value'.",
-);
-
-const ParserErrorCode _INVALID_OPERATOR = ParserErrorCode(
-  'INVALID_OPERATOR',
-  "The string '{0}' isn't a user-definable operator.",
-);
-
-const ParserErrorCode _INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER =
-    ParserErrorCode(
-  'INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER',
-  "The operator '?.' cannot be used with 'super' because 'super' cannot be null.",
-  correction: "Try replacing '?.' with '.'",
-);
-
-const ParserErrorCode _INVALID_SUPER_IN_INITIALIZER = ParserErrorCode(
-  'INVALID_SUPER_IN_INITIALIZER',
-  "Can only use 'super' in an initializer for calling the superclass constructor (e.g. 'super()' or 'super.namedConstructor()')",
-);
-
-const ParserErrorCode _INVALID_THIS_IN_INITIALIZER = ParserErrorCode(
-  'INVALID_THIS_IN_INITIALIZER',
-  "Can only use 'this' in an initializer for field initialization (e.g. 'this.x = something') and constructor redirection (e.g. 'this()' or 'this.namedConstructor())",
-);
-
-const ParserErrorCode _INVALID_UNICODE_ESCAPE = ParserErrorCode(
-  'INVALID_UNICODE_ESCAPE',
-  "An escape sequence starting with '\\u' must be followed by 4 hexadecimal digits or from 1 to 6 digits between '{' and '}'.",
-);
-
-const ParserErrorCode _INVALID_USE_OF_COVARIANT_IN_EXTENSION = ParserErrorCode(
-  'INVALID_USE_OF_COVARIANT_IN_EXTENSION',
-  "Can't have modifier '{0}' in an extension.",
-  correction: "Try removing '{0}'.",
-  hasPublishedDocs: true,
-);
-
-const ParserErrorCode _LIBRARY_DIRECTIVE_NOT_FIRST = ParserErrorCode(
-  'LIBRARY_DIRECTIVE_NOT_FIRST',
-  "The library directive must appear before all other directives.",
-  correction: "Try moving the library directive before any other directives.",
-);
-
-const ParserErrorCode _LITERAL_WITH_CLASS = ParserErrorCode(
-  'LITERAL_WITH_CLASS',
-  "A {0} literal can't be prefixed by '{1}'.",
-  correction: "Try removing '{1}'",
-);
-
-const ParserErrorCode _LITERAL_WITH_CLASS_AND_NEW = ParserErrorCode(
-  'LITERAL_WITH_CLASS_AND_NEW',
-  "A {0} literal can't be prefixed by 'new {1}'.",
-  correction: "Try removing 'new' and '{1}'",
-);
-
-const ParserErrorCode _LITERAL_WITH_NEW = ParserErrorCode(
-  'LITERAL_WITH_NEW',
-  "A literal can't be prefixed by 'new'.",
-  correction: "Try removing 'new'",
-);
-
-const ParserErrorCode _MEMBER_WITH_CLASS_NAME = ParserErrorCode(
-  'MEMBER_WITH_CLASS_NAME',
-  "A class member can't have the same name as the enclosing class.",
-  correction: "Try renaming the member.",
-);
-
-const ParserErrorCode _MISSING_ASSIGNABLE_SELECTOR = ParserErrorCode(
-  'MISSING_ASSIGNABLE_SELECTOR',
-  "Missing selector such as '.identifier' or '[0]'.",
-  correction: "Try adding a selector.",
-);
-
-const ParserErrorCode _MISSING_ASSIGNMENT_IN_INITIALIZER = ParserErrorCode(
-  'MISSING_ASSIGNMENT_IN_INITIALIZER',
-  "Expected an assignment after the field name.",
-  correction: "To initialize a field, use the syntax 'name = value'.",
-);
-
-const ParserErrorCode _MISSING_CATCH_OR_FINALLY = ParserErrorCode(
-  'MISSING_CATCH_OR_FINALLY',
-  "A try block must be followed by an 'on', 'catch', or 'finally' clause.",
-  correction:
-      "Try adding either a catch or finally clause, or remove the try statement.",
-);
-
-const ParserErrorCode _MISSING_CONST_FINAL_VAR_OR_TYPE = ParserErrorCode(
-  'MISSING_CONST_FINAL_VAR_OR_TYPE',
-  "Variables must be declared using the keywords 'const', 'final', 'var' or a type name.",
-  correction:
-      "Try adding the name of the type of the variable or the keyword 'var'.",
-);
-
-const ParserErrorCode _MISSING_EXPRESSION_IN_THROW = ParserErrorCode(
-  'MISSING_EXPRESSION_IN_THROW',
-  "Missing expression after 'throw'.",
-  correction:
-      "Add an expression after 'throw' or use 'rethrow' to throw a caught exception",
-);
-
-const ParserErrorCode _MISSING_INITIALIZER = ParserErrorCode(
-  'MISSING_INITIALIZER',
-  "Expected an initializer.",
-);
-
-const ParserErrorCode _MISSING_KEYWORD_OPERATOR = ParserErrorCode(
-  'MISSING_KEYWORD_OPERATOR',
-  "Operator declarations must be preceded by the keyword 'operator'.",
-  correction: "Try adding the keyword 'operator'.",
-);
-
-const ParserErrorCode _MISSING_PREFIX_IN_DEFERRED_IMPORT = ParserErrorCode(
-  'MISSING_PREFIX_IN_DEFERRED_IMPORT',
-  "Deferred imports should have a prefix.",
-  correction: "Try adding a prefix to the import by adding an 'as' clause.",
-);
-
-const ParserErrorCode _MISSING_STATEMENT = ParserErrorCode(
-  'MISSING_STATEMENT',
-  "Expected a statement.",
-);
-
-const ParserErrorCode _MIXIN_DECLARES_CONSTRUCTOR = ParserErrorCode(
-  'MIXIN_DECLARES_CONSTRUCTOR',
-  "Mixins can't declare constructors.",
-);
-
-const ParserErrorCode _MODIFIER_OUT_OF_ORDER = ParserErrorCode(
-  'MODIFIER_OUT_OF_ORDER',
-  "The modifier '{0}' should be before the modifier '{1}'.",
-  correction: "Try re-ordering the modifiers.",
-);
-
-const ParserErrorCode _MULTIPLE_EXTENDS_CLAUSES = ParserErrorCode(
-  'MULTIPLE_EXTENDS_CLAUSES',
-  "Each class definition can have at most one extends clause.",
-  correction:
-      "Try choosing one superclass and define your class to implement (or mix in) the others.",
-);
-
-const ParserErrorCode _MULTIPLE_LIBRARY_DIRECTIVES = ParserErrorCode(
-  'MULTIPLE_LIBRARY_DIRECTIVES',
-  "Only one library directive may be declared in a file.",
-  correction: "Try removing all but one of the library directives.",
-);
-
-const ParserErrorCode _MULTIPLE_ON_CLAUSES = ParserErrorCode(
-  'MULTIPLE_ON_CLAUSES',
-  "Each mixin definition can have at most one on clause.",
-  correction: "Try combining all of the on clauses into a single clause.",
-);
-
-const ParserErrorCode _MULTIPLE_PART_OF_DIRECTIVES = ParserErrorCode(
-  'MULTIPLE_PART_OF_DIRECTIVES',
-  "Only one part-of directive may be declared in a file.",
-  correction: "Try removing all but one of the part-of directives.",
-);
-
-const ParserErrorCode _MULTIPLE_VARIANCE_MODIFIERS = ParserErrorCode(
-  'MULTIPLE_VARIANCE_MODIFIERS',
-  "Each type parameter can have at most one variance modifier.",
-  correction: "Use at most one of the 'in', 'out', or 'inout' modifiers.",
-);
-
-const ParserErrorCode _MULTIPLE_WITH_CLAUSES = ParserErrorCode(
-  'MULTIPLE_WITH_CLAUSES',
-  "Each class definition can have at most one with clause.",
-  correction: "Try combining all of the with clauses into a single clause.",
-);
-
-const ParserErrorCode _NATIVE_CLAUSE_SHOULD_BE_ANNOTATION = ParserErrorCode(
-  'NATIVE_CLAUSE_SHOULD_BE_ANNOTATION',
-  "Native clause in this form is deprecated.",
-  correction:
-      "Try removing this native clause and adding @native() or @native('native-name') before the declaration.",
-);
-
-const ParserErrorCode _NULL_AWARE_CASCADE_OUT_OF_ORDER = ParserErrorCode(
-  'NULL_AWARE_CASCADE_OUT_OF_ORDER',
-  "The '?..' cascade operator must be first in the cascade sequence.",
-  correction:
-      "Try moving the '?..' operator to be the first cascade operator in the sequence.",
-);
-
-const ParserErrorCode _PREFIX_AFTER_COMBINATOR = ParserErrorCode(
-  'PREFIX_AFTER_COMBINATOR',
-  "The prefix ('as' clause) should come before any show/hide combinators.",
-  correction: "Try moving the prefix before the combinators.",
-);
-
-const ParserErrorCode _REDIRECTING_CONSTRUCTOR_WITH_BODY = ParserErrorCode(
-  'REDIRECTING_CONSTRUCTOR_WITH_BODY',
-  "Redirecting constructors can't have a body.",
-  correction:
-      "Try removing the body, or not making this a redirecting constructor.",
-);
-
-const ParserErrorCode _REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR = ParserErrorCode(
-  'REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR',
-  "Only factory constructor can specify '=' redirection.",
-  correction:
-      "Try making this a factory constructor, or remove the redirection.",
-);
-
-const ParserErrorCode _SETTER_CONSTRUCTOR = ParserErrorCode(
-  'SETTER_CONSTRUCTOR',
-  "Constructors can't be a setter.",
-  correction: "Try removing 'set'.",
-);
-
-const ParserErrorCode _STACK_OVERFLOW = ParserErrorCode(
-  'STACK_OVERFLOW',
-  "The file has too many nested expressions or statements.",
-  correction: "Try simplifying the code.",
-);
-
-const ParserErrorCode _STATIC_CONSTRUCTOR = ParserErrorCode(
-  'STATIC_CONSTRUCTOR',
-  "Constructors can't be static.",
-  correction: "Try removing the keyword 'static'.",
-);
-
-const ParserErrorCode _STATIC_OPERATOR = ParserErrorCode(
-  'STATIC_OPERATOR',
-  "Operators can't be static.",
-  correction: "Try removing the keyword 'static'.",
-);
-
-const ParserErrorCode _SWITCH_HAS_CASE_AFTER_DEFAULT_CASE = ParserErrorCode(
-  'SWITCH_HAS_CASE_AFTER_DEFAULT_CASE',
-  "The default case should be the last case in a switch statement.",
-  correction: "Try moving the default case after the other case clauses.",
-);
-
-const ParserErrorCode _SWITCH_HAS_MULTIPLE_DEFAULT_CASES = ParserErrorCode(
-  'SWITCH_HAS_MULTIPLE_DEFAULT_CASES',
-  "The 'default' case can only be declared once.",
-  correction: "Try removing all but one default case.",
-);
-
-const ParserErrorCode _TOP_LEVEL_OPERATOR = ParserErrorCode(
-  'TOP_LEVEL_OPERATOR',
-  "Operators must be declared within a class.",
-  correction:
-      "Try removing the operator, moving it to a class, or converting it to be a function.",
-);
-
-const ParserErrorCode _TYPEDEF_IN_CLASS = ParserErrorCode(
-  'TYPEDEF_IN_CLASS',
-  "Typedefs can't be declared inside classes.",
-  correction: "Try moving the typedef to the top-level.",
-);
-
-const ParserErrorCode _TYPE_ARGUMENTS_ON_TYPE_VARIABLE = ParserErrorCode(
-  'TYPE_ARGUMENTS_ON_TYPE_VARIABLE',
-  "Can't use type arguments with type variable '{0}'.",
-  correction: "Try removing the type arguments.",
-);
-
-const ParserErrorCode _TYPE_BEFORE_FACTORY = ParserErrorCode(
-  'TYPE_BEFORE_FACTORY',
-  "Factory constructors cannot have a return type.",
-  correction: "Try removing the type appearing before 'factory'.",
-);
-
-const ParserErrorCode _TYPE_PARAMETER_ON_CONSTRUCTOR = ParserErrorCode(
-  'TYPE_PARAMETER_ON_CONSTRUCTOR',
-  "Constructors can't have type parameters.",
-  correction: "Try removing the type parameters.",
-);
-
-const ParserErrorCode _VAR_AND_TYPE = ParserErrorCode(
-  'VAR_AND_TYPE',
-  "Variables can't be declared using both 'var' and a type name.",
-  correction: "Try removing 'var.'",
-);
-
-const ParserErrorCode _VAR_AS_TYPE_NAME = ParserErrorCode(
-  'VAR_AS_TYPE_NAME',
-  "The keyword 'var' can't be used as a type name.",
-);
-
-const ParserErrorCode _VAR_RETURN_TYPE = ParserErrorCode(
-  'VAR_RETURN_TYPE',
-  "The return type can't be 'var'.",
-  correction:
-      "Try removing the keyword 'var', or replacing it with the name of the return type.",
-);
-
-const ParserErrorCode _VOID_WITH_TYPE_ARGUMENTS = ParserErrorCode(
-  'VOID_WITH_TYPE_ARGUMENTS',
-  "Type 'void' can't have type arguments.",
-  correction: "Try removing the type arguments.",
-);
-
-const ParserErrorCode _WITH_BEFORE_EXTENDS = ParserErrorCode(
-  'WITH_BEFORE_EXTENDS',
-  "The extends clause must be before the with clause.",
-  correction: "Try moving the extends clause before the with clause.",
-);
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 9abd454..6f77e5f 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -3416,7 +3416,7 @@
     if (message == messageNativeClauseShouldBeAnnotation && allowNativeClause) {
       return;
     }
-    debugEvent("Error: ${message.message}");
+    debugEvent("Error: ${message.problemMessage}");
     if (message.code.analyzerCodes == null && startToken is ErrorToken) {
       translateErrorToken(startToken, errorReporter.reportScannerError);
     } else {
@@ -3728,7 +3728,7 @@
 
   @override
   Never internalProblem(Message message, int charOffset, Uri uri) {
-    throw UnsupportedError(message.message);
+    throw UnsupportedError(message.problemMessage);
   }
 
   /// Return `true` if [token] is either `null` or is the symbol or keyword
diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml
index f5cd801..d9effde 100644
--- a/pkg/analyzer/messages.yaml
+++ b/pkg/analyzer/messages.yaml
@@ -17335,17 +17335,9 @@
       A code indicating that a specified hardware feature is not supported on
       Chrome OS.
 ParserErrorCode:
-  ABSTRACT_CLASS_MEMBER:
-    copyFromCfe: true
   ABSTRACT_ENUM:
     problemMessage: "Enums can't be declared to be 'abstract'."
     correctionMessage: "Try removing the keyword 'abstract'."
-  ABSTRACT_EXTERNAL_FIELD:
-    copyFromCfe: true
-  ABSTRACT_LATE_FIELD:
-    copyFromCfe: true
-  ABSTRACT_STATIC_FIELD:
-    copyFromCfe: true
   ABSTRACT_STATIC_METHOD:
     problemMessage: "Static methods can't be declared to be 'abstract'."
     correctionMessage: "Try removing the keyword 'abstract'."
@@ -17358,64 +17350,24 @@
   ABSTRACT_TYPEDEF:
     problemMessage: "Typedefs can't be declared to be 'abstract'."
     correctionMessage: "Try removing the keyword 'abstract'."
-  ANNOTATION_ON_TYPE_ARGUMENT:
-    copyFromCfe: true
-  ANNOTATION_WITH_TYPE_ARGUMENTS:
-    copyFromCfe: true
-  ANNOTATION_WITH_TYPE_ARGUMENTS_UNINSTANTIATED:
-    copyFromCfe: true
   ASYNC_KEYWORD_USED_AS_IDENTIFIER:
     problemMessage: "The keywords 'await' and 'yield' can't be used as identifiers in an asynchronous or generator function."
     comment: |-
       16.32 Identifier Reference: It is a compile-time error if any of the
       identifiers async, await, or yield is used as an identifier in a function
       body marked with either async, async, or sync.
-  BINARY_OPERATOR_WRITTEN_OUT:
-    copyFromCfe: true
-  BREAK_OUTSIDE_OF_LOOP:
-    copyFromCfe: true
-  CATCH_SYNTAX:
-    copyFromCfe: true
-  CATCH_SYNTAX_EXTRA_PARAMETERS:
-    copyFromCfe: true
-  CLASS_IN_CLASS:
-    copyFromCfe: true
-  COLON_IN_PLACE_OF_IN:
-    copyFromCfe: true
-  CONFLICTING_MODIFIERS:
-    copyFromCfe: true
-  CONSTRUCTOR_WITH_RETURN_TYPE:
-    copyFromCfe: true
-  CONSTRUCTOR_WITH_TYPE_ARGUMENTS:
-    copyFromCfe: true
-  CONST_AND_FINAL:
-    copyFromCfe: true
-  CONST_CLASS:
-    copyFromCfe: true
   CONST_CONSTRUCTOR_WITH_BODY:
     problemMessage: "Const constructors can't have a body."
     correctionMessage: "Try removing either the 'const' keyword or the body."
   CONST_ENUM:
     problemMessage: "Enums can't be declared to be 'const'."
     correctionMessage: "Try removing the 'const' keyword."
-  CONST_FACTORY:
-    copyFromCfe: true
-  CONST_METHOD:
-    copyFromCfe: true
   CONST_TYPEDEF:
     problemMessage: "Type aliases can't be declared to be 'const'."
     correctionMessage: "Try removing the 'const' keyword."
-  CONTINUE_OUTSIDE_OF_LOOP:
-    copyFromCfe: true
-  CONTINUE_WITHOUT_LABEL_IN_CASE:
-    copyFromCfe: true
-  COVARIANT_AND_STATIC:
-    copyFromCfe: true
   COVARIANT_CONSTRUCTOR:
     problemMessage: "A constructor can't be declared to be 'covariant'."
     correctionMessage: "Try removing the keyword 'covariant'."
-  COVARIANT_MEMBER:
-    copyFromCfe: true
   COVARIANT_TOP_LEVEL_DECLARATION:
     problemMessage: "Top-level declarations can't be declared to be covariant."
     correctionMessage: "Try removing the keyword 'covariant'."
@@ -17450,48 +17402,18 @@
       void f(void Function([int p]) g) {
       }
       ```
-  DEFERRED_AFTER_PREFIX:
-    copyFromCfe: true
-  DIRECTIVE_AFTER_DECLARATION:
-    copyFromCfe: true
-  DUPLICATED_MODIFIER:
-    copyFromCfe: true
-    comment: |-
-      Parameters:
-      0: the modifier that was duplicated
-  DUPLICATE_DEFERRED:
-    copyFromCfe: true
-  DUPLICATE_LABEL_IN_SWITCH_STATEMENT:
-    copyFromCfe: true
-    comment: |-
-      Parameters:
-      0: the label that was duplicated
-  DUPLICATE_PREFIX:
-    copyFromCfe: true
   EMPTY_ENUM_BODY:
     problemMessage: An enum must declare at least one constant name.
     correctionMessage: Try declaring a constant.
-  ENUM_IN_CLASS:
-    copyFromCfe: true
-  EQUALITY_CANNOT_BE_EQUALITY_OPERAND:
-    copyFromCfe: true
-  EXPECTED_BODY:
-    copyFromCfe: true
   EXPECTED_CASE_OR_DEFAULT:
     problemMessage: "Expected 'case' or 'default'."
     correctionMessage: Try placing this code inside a case clause.
   EXPECTED_CLASS_MEMBER:
     problemMessage: Expected a class member.
     correctionMessage: Try placing this code inside a class member.
-  EXPECTED_ELSE_OR_COMMA:
-    copyFromCfe: true
   EXPECTED_EXECUTABLE:
     problemMessage: Expected a method, getter, setter or operator declaration.
     correctionMessage: This appears to be incomplete code. Try removing it or completing it.
-  EXPECTED_IDENTIFIER_BUT_GOT_KEYWORD:
-    copyFromCfe: true
-  EXPECTED_INSTEAD:
-    copyFromCfe: true
   EXPECTED_LIST_OR_MAP_LITERAL:
     problemMessage: Expected a list or map literal.
     correctionMessage: Try inserting a list or map literal, or remove the type arguments.
@@ -17504,133 +17426,21 @@
       0: the token that was expected but not found
   EXPECTED_TYPE_NAME:
     problemMessage: Expected a type name.
-  EXPERIMENT_NOT_ENABLED:
-    copyFromCfe: true
-  EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE:
-    copyFromCfe: true
-  EXTENSION_DECLARES_ABSTRACT_MEMBER:
-    copyFromCfe: true
-    comment: No parameters.
-    documentation: |-
-      #### Description
-
-      The analyzer produces this diagnostic when an abstract declaration is
-      declared in an extension. Extensions can declare only concrete members.
-
-      #### Examples
-
-      The following code produces this diagnostic because the method `a` doesn't
-      have a body:
-
-      ```dart
-      extension E on String {
-        int [!a!]();
-      }
-      ```
-
-      #### Common fixes
-
-      Either provide an implementation for the member or remove it.
-  EXTENSION_DECLARES_CONSTRUCTOR:
-    copyFromCfe: true
-    comment: No parameters.
-    documentation: |-
-      #### Description
-
-      The analyzer produces this diagnostic when a constructor declaration is
-      found in an extension. It isn't valid to define a constructor because
-      extensions aren't classes, and it isn't possible to create an instance of
-      an extension.
-
-      #### Examples
-
-      The following code produces this diagnostic because there is a constructor
-      declaration in `E`:
-
-      ```dart
-      extension E on String {
-        [!E!]() : super();
-      }
-      ```
-
-      #### Common fixes
-
-      Remove the constructor or replace it with a static method.
-  EXTENSION_DECLARES_INSTANCE_FIELD:
-    copyFromCfe: true
-    comment: No parameters.
-    documentation: |-
-      #### Description
-
-      The analyzer produces this diagnostic when an instance field declaration is
-      found in an extension. It isn't valid to define an instance field because
-      extensions can only add behavior, not state.
-
-      #### Examples
-
-      The following code produces this diagnostic because `s` is an instance
-      field:
-
-      ```dart
-      %language=2.9
-      extension E on String {
-        String [!s!];
-      }
-      ```
-
-      #### Common fixes
-
-      Remove the field, make it a static field, or convert it to be a getter,
-      setter, or method.
-  EXTERNAL_CLASS:
-    copyFromCfe: true
-  EXTERNAL_CONSTRUCTOR_WITH_BODY:
-    copyFromCfe: true
-  EXTERNAL_CONSTRUCTOR_WITH_INITIALIZER:
-    copyFromCfe: true
-  EXTERNAL_ENUM:
-    copyFromCfe: true
-  EXTERNAL_FACTORY_REDIRECTION:
-    copyFromCfe: true
-  EXTERNAL_FACTORY_WITH_BODY:
-    copyFromCfe: true
-  EXTERNAL_FIELD:
-    copyFromCfe: true
   EXTERNAL_GETTER_WITH_BODY:
     problemMessage: "External getters can't have a body."
     correctionMessage: "Try removing the body of the getter, or removing the keyword 'external'."
-  EXTERNAL_LATE_FIELD:
-    copyFromCfe: true
-  EXTERNAL_METHOD_WITH_BODY:
-    copyFromCfe: true
   EXTERNAL_OPERATOR_WITH_BODY:
     problemMessage: "External operators can't have a body."
     correctionMessage: "Try removing the body of the operator, or removing the keyword 'external'."
   EXTERNAL_SETTER_WITH_BODY:
     problemMessage: "External setters can't have a body."
     correctionMessage: "Try removing the body of the setter, or removing the keyword 'external'."
-  EXTERNAL_TYPEDEF:
-    copyFromCfe: true
-  EXTRANEOUS_MODIFIER:
-    copyFromCfe: true
-  FACTORY_TOP_LEVEL_DECLARATION:
-    copyFromCfe: true
   FACTORY_WITHOUT_BODY:
     problemMessage: "A non-redirecting 'factory' constructor must have a body."
     correctionMessage: Try adding a body to the constructor.
   FACTORY_WITH_INITIALIZERS:
     problemMessage: "A 'factory' constructor can't have initializers."
     correctionMessage: "Try removing the 'factory' keyword to make this a generative constructor, or removing the initializers."
-  FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS:
-    copyFromCfe: true
-  FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR:
-    copyFromCfe: true
-  FINAL_AND_COVARIANT:
-    copyFromCfe: true
-  FINAL_AND_COVARIANT_LATE_WITH_INITIALIZER:
-    copyFromCfe: true
-  FINAL_AND_VAR:
-    copyFromCfe: true
   FINAL_CLASS:
     problemMessage: "Classes can't be declared to be 'final'."
     correctionMessage: "Try removing the keyword 'final'."
@@ -17649,28 +17459,12 @@
   FUNCTION_TYPED_PARAMETER_VAR:
     problemMessage: "Function-typed parameters can't specify 'const', 'final' or 'var' in place of a return type."
     correctionMessage: Try replacing the keyword with a return type.
-  GETTER_CONSTRUCTOR:
-    copyFromCfe: true
   GETTER_IN_FUNCTION:
     problemMessage: "Getters can't be defined within methods or functions."
     correctionMessage: Try moving the getter outside the method or function, or converting the getter to a function.
   GETTER_WITH_PARAMETERS:
     problemMessage: Getters must be declared without a parameter list.
     correctionMessage: "Try removing the parameter list, or removing the keyword 'get' to define a method rather than a getter."
-  ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE:
-    copyFromCfe: true
-  IMPLEMENTS_BEFORE_EXTENDS:
-    copyFromCfe: true
-  IMPLEMENTS_BEFORE_ON:
-    copyFromCfe: true
-  IMPLEMENTS_BEFORE_WITH:
-    copyFromCfe: true
-  IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE:
-    copyFromCfe: true
-  INITIALIZED_VARIABLE_IN_FOR_EACH:
-    copyFromCfe: true
-  INVALID_AWAIT_IN_FOR:
-    copyFromCfe: true
   INVALID_CODE_POINT:
     problemMessage: "The escape sequence '{0}' isn't a valid code point."
     comment: |-
@@ -17678,23 +17472,12 @@
       0: the invalid escape sequence
   INVALID_COMMENT_REFERENCE:
     problemMessage: "Comment references should contain a possibly prefixed identifier and can start with 'new', but shouldn't contain anything else."
-  INVALID_CONSTRUCTOR_NAME:
-    copyFromCfe: true
   INVALID_GENERIC_FUNCTION_TYPE:
     problemMessage: Invalid generic function type.
     correctionMessage: "Try using a generic function type (returnType 'Function(' parameters ')')."
-  INVALID_HEX_ESCAPE:
-    copyFromCfe: true
-  INVALID_INITIALIZER:
-    copyFromCfe: true
   INVALID_LITERAL_IN_CONFIGURATION:
     problemMessage: "The literal in a configuration can't contain interpolation."
     correctionMessage: Try removing the interpolation expressions.
-  INVALID_OPERATOR:
-    copyFromCfe: true
-    comment: |-
-      Parameters:
-      0: the operator that is invalid
   INVALID_OPERATOR_FOR_SUPER:
     problemMessage: "The operator '{0}' can't be used with 'super'."
     comment: |-
@@ -17703,83 +17486,24 @@
 
       Only generated by the old parser.
       Replaced by INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER.
-  INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER:
-    copyFromCfe: true
   INVALID_STAR_AFTER_ASYNC:
     problemMessage: "The modifier 'async*' isn't allowed for an expression function body."
     correctionMessage: Try converting the body to a block.
-  INVALID_SUPER_IN_INITIALIZER:
-    copyFromCfe: true
   INVALID_SYNC:
     problemMessage: "The modifier 'sync' isn't allowed for an expression function body."
     correctionMessage: Try converting the body to a block.
-  INVALID_THIS_IN_INITIALIZER:
-    copyFromCfe: true
-  INVALID_UNICODE_ESCAPE:
-    copyFromCfe: true
-  INVALID_USE_OF_COVARIANT_IN_EXTENSION:
-    copyFromCfe: true
-    comment: No parameters.
-    documentation: |-
-      #### Description
-
-      The analyzer produces this diagnostic when a member declared inside an
-      extension uses the keyword `covariant` in the declaration of a parameter.
-      Extensions aren't classes and don't have subclasses, so the keyword serves
-      no purpose.
-
-      #### Examples
-
-      The following code produces this diagnostic because `i` is marked as being
-      covariant:
-
-      ```dart
-      extension E on String {
-        void a([!covariant!] int i) {}
-      }
-      ```
-
-      #### Common fixes
-
-      Remove the `covariant` keyword:
-
-      ```dart
-      extension E on String {
-        void a(int i) {}
-      }
-      ```
-  LIBRARY_DIRECTIVE_NOT_FIRST:
-    copyFromCfe: true
-  LITERAL_WITH_CLASS:
-    copyFromCfe: true
-  LITERAL_WITH_CLASS_AND_NEW:
-    copyFromCfe: true
-  LITERAL_WITH_NEW:
-    copyFromCfe: true
   LOCAL_FUNCTION_DECLARATION_MODIFIER:
     problemMessage: "Local function declarations can't specify any modifiers."
     correctionMessage: Try removing the modifier.
-  MEMBER_WITH_CLASS_NAME:
-    copyFromCfe: true
-  MISSING_ASSIGNABLE_SELECTOR:
-    copyFromCfe: true
-  MISSING_ASSIGNMENT_IN_INITIALIZER:
-    copyFromCfe: true
-  MISSING_CATCH_OR_FINALLY:
-    copyFromCfe: true
   MISSING_CLOSING_PARENTHESIS:
     problemMessage: The closing parenthesis is missing.
     correctionMessage: Try adding the closing parenthesis.
-  MISSING_CONST_FINAL_VAR_OR_TYPE:
-    copyFromCfe: true
   MISSING_ENUM_BODY:
     problemMessage: An enum definition must have a body with at least one constant name.
     correctionMessage: Try adding a body and defining at least one constant.
   MISSING_EXPRESSION_IN_INITIALIZER:
     problemMessage: Expected an expression after the assignment operator.
     correctionMessage: Try adding the value to be assigned, or remove the assignment operator.
-  MISSING_EXPRESSION_IN_THROW:
-    copyFromCfe: true
   MISSING_FUNCTION_BODY:
     problemMessage: A function body must be provided.
     correctionMessage: Try adding a function body.
@@ -17794,10 +17518,6 @@
     correctionMessage: "Try adding the keyword 'get'."
   MISSING_IDENTIFIER:
     problemMessage: Expected an identifier.
-  MISSING_INITIALIZER:
-    copyFromCfe: true
-  MISSING_KEYWORD_OPERATOR:
-    copyFromCfe: true
   MISSING_METHOD_PARAMETERS:
     problemMessage: Methods must have an explicit list of parameters.
     correctionMessage: Try adding a parameter list.
@@ -17810,13 +17530,9 @@
   MISSING_NAME_IN_PART_OF_DIRECTIVE:
     problemMessage: Part-of directives must include a library name.
     correctionMessage: "Try adding a library name after the 'of'."
-  MISSING_PREFIX_IN_DEFERRED_IMPORT:
-    copyFromCfe: true
   MISSING_STAR_AFTER_SYNC:
     problemMessage: "The modifier 'sync' must be followed by a star ('*')."
     correctionMessage: Try removing the modifier, or add a star.
-  MISSING_STATEMENT:
-    copyFromCfe: true
   MISSING_TERMINATOR_FOR_PARAMETER_GROUP:
     problemMessage: "There is no '{0}' to close the parameter group."
     correctionMessage: "Try inserting a '{0}' at the end of the group."
@@ -17832,24 +17548,12 @@
   MIXED_PARAMETER_GROUPS:
     problemMessage: "Can't have both positional and named parameters in a single parameter list."
     correctionMessage: Try choosing a single style of optional parameters.
-  MIXIN_DECLARES_CONSTRUCTOR:
-    copyFromCfe: true
-  MODIFIER_OUT_OF_ORDER:
-    copyFromCfe: true
-  MULTIPLE_EXTENDS_CLAUSES:
-    copyFromCfe: true
   MULTIPLE_IMPLEMENTS_CLAUSES:
     problemMessage: Each class or mixin definition can have at most one implements clause.
     correctionMessage: Try combining all of the implements clauses into a single clause.
-  MULTIPLE_LIBRARY_DIRECTIVES:
-    copyFromCfe: true
   MULTIPLE_NAMED_PARAMETER_GROUPS:
     problemMessage: "Can't have multiple groups of named parameters in a single parameter list."
     correctionMessage: Try combining all of the groups into a single group.
-  MULTIPLE_ON_CLAUSES:
-    copyFromCfe: true
-  MULTIPLE_PART_OF_DIRECTIVES:
-    copyFromCfe: true
   MULTIPLE_POSITIONAL_PARAMETER_GROUPS:
     problemMessage: "Can't have multiple groups of positional parameters in a single parameter list."
     correctionMessage: Try combining all of the groups into a single group.
@@ -17859,10 +17563,6 @@
     comment: |-
       Parameters:
       0: the number of variables being declared
-  MULTIPLE_VARIANCE_MODIFIERS:
-    copyFromCfe: true
-  MULTIPLE_WITH_CLAUSES:
-    copyFromCfe: true
   NAMED_FUNCTION_EXPRESSION:
     problemMessage: "Function expressions can't be named."
     correctionMessage: Try removing the name, or moving the function expression to a function declaration statement.
@@ -17875,8 +17575,6 @@
   NATIVE_CLAUSE_IN_NON_SDK_CODE:
     problemMessage: Native clause can only be used in the SDK and code that is loaded through native extensions.
     correctionMessage: Try removing the native clause.
-  NATIVE_CLAUSE_SHOULD_BE_ANNOTATION:
-    copyFromCfe: true
   NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE:
     problemMessage: Native functions can only be declared in the SDK and code that is loaded through native extensions.
     correctionMessage: "Try removing the word 'native'."
@@ -17900,54 +17598,24 @@
   NORMAL_BEFORE_OPTIONAL_PARAMETERS:
     problemMessage: Normal parameters must occur before optional parameters.
     correctionMessage: Try moving all of the normal parameters before the optional parameters.
-  NULL_AWARE_CASCADE_OUT_OF_ORDER:
-    copyFromCfe: true
   POSITIONAL_AFTER_NAMED_ARGUMENT:
     problemMessage: Positional arguments must occur before named arguments.
     correctionMessage: Try moving all of the positional arguments before the named arguments.
   POSITIONAL_PARAMETER_OUTSIDE_GROUP:
     problemMessage: "Positional parameters must be enclosed in square brackets ('[' and ']')."
     correctionMessage: Try surrounding the positional parameters in square brackets.
-  PREFIX_AFTER_COMBINATOR:
-    copyFromCfe: true
-  REDIRECTING_CONSTRUCTOR_WITH_BODY:
-    copyFromCfe: true
-  REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR:
-    copyFromCfe: true
-  SETTER_CONSTRUCTOR:
-    copyFromCfe: true
   SETTER_IN_FUNCTION:
     problemMessage: "Setters can't be defined within methods or functions."
     correctionMessage: Try moving the setter outside the method or function.
-  STACK_OVERFLOW:
-    copyFromCfe: true
-  STATIC_CONSTRUCTOR:
-    copyFromCfe: true
   STATIC_GETTER_WITHOUT_BODY:
     problemMessage: "A 'static' getter must have a body."
     correctionMessage: "Try adding a body to the getter, or removing the keyword 'static'."
-  STATIC_OPERATOR:
-    copyFromCfe: true
   STATIC_SETTER_WITHOUT_BODY:
     problemMessage: "A 'static' setter must have a body."
     correctionMessage: "Try adding a body to the setter, or removing the keyword 'static'."
   STATIC_TOP_LEVEL_DECLARATION:
     problemMessage: "Top-level declarations can't be declared to be static."
     correctionMessage: "Try removing the keyword 'static'."
-  SWITCH_HAS_CASE_AFTER_DEFAULT_CASE:
-    copyFromCfe: true
-  SWITCH_HAS_MULTIPLE_DEFAULT_CASES:
-    copyFromCfe: true
-  TOP_LEVEL_OPERATOR:
-    copyFromCfe: true
-  TYPEDEF_IN_CLASS:
-    copyFromCfe: true
-  TYPE_ARGUMENTS_ON_TYPE_VARIABLE:
-    copyFromCfe: true
-  TYPE_BEFORE_FACTORY:
-    copyFromCfe: true
-  TYPE_PARAMETER_ON_CONSTRUCTOR:
-    copyFromCfe: true
   TYPE_PARAMETER_ON_OPERATOR:
     problemMessage: "Types parameters aren't allowed when defining an operator."
     correctionMessage: Try removing the type parameters.
@@ -17966,25 +17634,15 @@
     comment: |-
       Parameters:
       0: the unexpected text that was found
-  VAR_AND_TYPE:
-    copyFromCfe: true
-  VAR_AS_TYPE_NAME:
-    copyFromCfe: true
   VAR_CLASS:
     problemMessage: "Classes can't be declared to be 'var'."
     correctionMessage: "Try removing the keyword 'var'."
   VAR_ENUM:
     problemMessage: "Enums can't be declared to be 'var'."
     correctionMessage: "Try removing the keyword 'var'."
-  VAR_RETURN_TYPE:
-    copyFromCfe: true
   VAR_TYPEDEF:
     problemMessage: "Typedefs can't be declared to be 'var'."
     correctionMessage: "Try removing the keyword 'var', or replacing it with the name of the return type."
-  VOID_WITH_TYPE_ARGUMENTS:
-    copyFromCfe: true
-  WITH_BEFORE_EXTENDS:
-    copyFromCfe: true
   WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER:
     problemMessage: "The default value of a positional parameter should be preceded by '='."
     correctionMessage: "Try replacing the ':' with '='."
diff --git a/pkg/analyzer/tool/diagnostics/generate.dart b/pkg/analyzer/tool/diagnostics/generate.dart
index 30b25bc..acc861c 100644
--- a/pkg/analyzer/tool/diagnostics/generate.dart
+++ b/pkg/analyzer/tool/diagnostics/generate.dart
@@ -43,7 +43,7 @@
     [analyzerPath, 'lib', 'src', 'pubspec', 'pubspec_warning_code.g.dart'],
   ], [
     null,
-    [analyzerPath, 'lib', 'src', 'dart', 'error', 'syntactic_errors.g.dart'],
+    null,
     null,
     null,
   ]);
diff --git a/pkg/analyzer/tool/messages/error_code_info.dart b/pkg/analyzer/tool/messages/error_code_info.dart
index bc63b2b..83a511e 100644
--- a/pkg/analyzer/tool/messages/error_code_info.dart
+++ b/pkg/analyzer/tool/messages/error_code_info.dart
@@ -128,13 +128,6 @@
   /// error in code generated output.
   final String? comment;
 
-  /// `true` if this error should be copied from an error in the CFE.  The
-  /// purpose of this field is so that the documentation for the error can exist
-  /// in the analyzer's messages.yaml file but the error text can come from the
-  /// CFE's messages.yaml file.  TODO(paulberry): add support for documentation
-  /// to the CFE's messages.yaml file so that this isn't necessary.
-  final bool copyFromCfe;
-
   /// If the error code has an associated correctionMessage, the template for
   /// it.
   final String? correctionMessage;
@@ -153,9 +146,8 @@
   /// Indicates whether this error is caused by an unresolved identifier.
   final bool isUnresolvedIdentifier;
 
-  /// The problemMessage for the error code, or `null` if [copyFromCfe] is
-  /// `true`.
-  final String? problemMessage;
+  /// The problemMessage for the error code.
+  final String problemMessage;
 
   /// If present, indicates that this error code has a special name for
   /// presentation to the user, that is potentially shared with other error
@@ -165,40 +157,26 @@
   ErrorCodeInfo(
       {this.analyzerCode = const [],
       this.comment,
-      this.copyFromCfe = false,
       this.documentation,
       this.hasPublishedDocs = false,
       this.index,
       this.isUnresolvedIdentifier = false,
       this.sharedName,
-      this.problemMessage,
-      this.correctionMessage}) {
-    if (copyFromCfe) {
-      if (problemMessage != null) {
-        throw "Error codes marked `copyFromCfe: true` can't have a "
-            "problemMessage.";
-      }
-    } else {
-      if (problemMessage == null) {
-        throw 'Error codes must have a problemMessage unless they are marked '
-            '`copyFromCfe: true`.';
-      }
-    }
-  }
+      required this.problemMessage,
+      this.correctionMessage});
 
   /// Decodes an [ErrorCodeInfo] object from its YAML representation.
   ErrorCodeInfo.fromYaml(Map<Object?, Object?> yaml)
       : this(
             analyzerCode: _decodeAnalyzerCode(yaml['analyzerCode']),
             comment: yaml['comment'] as String?,
-            copyFromCfe: yaml['copyFromCfe'] as bool? ?? false,
             correctionMessage: yaml['correctionMessage'] as String?,
             documentation: yaml['documentation'] as String?,
             hasPublishedDocs: yaml['hasPublishedDocs'] as bool? ?? false,
             index: yaml['index'] as int?,
             isUnresolvedIdentifier:
                 yaml['isUnresolvedIdentifier'] as bool? ?? false,
-            problemMessage: yaml['problemMessage'] as String?,
+            problemMessage: yaml['problemMessage'] as String,
             sharedName: yaml['sharedName'] as String?);
 
   /// Generates a dart declaration for this error code, suitable for inclusion
@@ -210,7 +188,7 @@
     out.writeln("'${sharedName ?? errorCode}',");
     final placeholderToIndexMap = _computePlaceholderToIndexMap();
     out.writeln(
-        json.encode(_convertTemplate(placeholderToIndexMap, problemMessage!)) +
+        json.encode(_convertTemplate(placeholderToIndexMap, problemMessage)) +
             ',');
     final correctionMessage = this.correctionMessage;
     if (correctionMessage is String) {
@@ -254,11 +232,10 @@
 
   /// Encodes this object into a YAML representation.
   Map<Object?, Object?> toYaml() => {
-        if (copyFromCfe) 'copyFromCfe': true,
         if (sharedName != null) 'sharedName': sharedName,
         if (analyzerCode.isNotEmpty)
           'analyzerCode': _encodeAnalyzerCode(analyzerCode),
-        if (problemMessage != null) 'problemMessage': problemMessage,
+        'problemMessage': problemMessage,
         if (correctionMessage != null) 'correctionMessage': correctionMessage,
         if (isUnresolvedIdentifier) 'isUnresolvedIdentifier': true,
         if (hasPublishedDocs) 'hasPublishedDocs': true,
diff --git a/pkg/analyzer/tool/messages/extract_errors_to_yaml.dart b/pkg/analyzer/tool/messages/extract_errors_to_yaml.dart
index 4834120..b1374d2 100644
--- a/pkg/analyzer/tool/messages/extract_errors_to_yaml.dart
+++ b/pkg/analyzer/tool/messages/extract_errors_to_yaml.dart
@@ -10,7 +10,6 @@
 // TODO(paulberry): once code generation is in place, remove this script.
 
 import 'dart:convert';
-import 'dart:io';
 
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/analysis/utilities.dart';
@@ -27,29 +26,14 @@
 
 main() {
   var errorDeclarations = _findErrorDeclarations();
-  var generatedAnalyzerCodes = _computeGeneratedAnalyzerCodes();
   var errorCodesByClass = _findErrorCodesByClass();
-  _generateYaml(errorCodesByClass, errorDeclarations, generatedAnalyzerCodes);
+  _generateYaml(errorCodesByClass, errorDeclarations);
 }
 
 /// The path to the `analyzer` package.
 final String _analyzerPkgPath =
     normalize(join(pkg_root.packageRoot, 'analyzer'));
 
-/// The path to the `analyzer` package.
-final String _frontEndPkgPath =
-    normalize(join(pkg_root.packageRoot, 'front_end'));
-
-/// Computes the set of `ParserErrorCode`s that are generated based on
-/// `pkg/front_end/messages.yaml`.
-Set<String> _computeGeneratedAnalyzerCodes() {
-  Map<dynamic, dynamic> messagesYaml = loadYaml(
-      File(join(_frontEndPkgPath, 'messages.yaml')).readAsStringSync());
-  var messages = decodeCfeMessagesYaml(messagesYaml);
-  var tables = CfeToAnalyzerErrorCodeTables(messages);
-  return tables.infoToAnalyzerCode.values.toSet();
-}
-
 /// Encodes [yaml] into a string parseable as YAML.
 ///
 /// YAML is complex and we are just trying to do a good enough job for a one
@@ -205,10 +189,8 @@
 /// [_findErrorCodesByClass]) and [errorDeclarations] (obtained from
 /// [_findErrorDeclarations]) into a YAML representation of the errors, and
 /// prints the resulting YAML.
-void _generateYaml(
-    Map<String, List<ErrorCode>> errorCodesByClass,
-    Map<String, Map<String, VariableDeclaration>> errorDeclarations,
-    Set<String> generatedAnalyzerCodes) {
+void _generateYaml(Map<String, List<ErrorCode>> errorCodesByClass,
+    Map<String, Map<String, VariableDeclaration>> errorDeclarations) {
   var yaml = <String, Map<String, Object?>>{};
   for (var entry in errorCodesByClass.entries) {
     var yamlCodes = <String, Object?>{};
@@ -239,27 +221,15 @@
       var commentInfo = _extractCommentInfo(fieldDeclaration);
       var documentationComment = commentInfo.documentationComment;
       var otherComment = commentInfo.otherComment;
-      ErrorCodeInfo errorCodeInfo;
-      if (className == 'ParserErrorCode' &&
-          generatedAnalyzerCodes.contains(name)) {
-        if (uniqueNameSuffix != name) {
-          throw "Auto-generated parser error codes can't be aliased";
-        }
-        errorCodeInfo = ErrorCodeInfo(
-            copyFromCfe: true,
-            comment: documentationComment,
-            documentation: otherComment);
-      } else {
-        errorCodeInfo = ErrorCodeInfo(
-            sharedName: uniqueNameSuffix == name ? null : name,
-            problemMessage: code.message,
-            correctionMessage: code.correction,
-            isUnresolvedIdentifier: code.isUnresolvedIdentifier,
-            hasPublishedDocs: code.hasPublishedDocs,
-            comment: documentationComment,
-            documentation: otherComment);
-      }
-      yamlCodes[uniqueNameSuffix] = errorCodeInfo.toYaml();
+      yamlCodes[uniqueNameSuffix] = ErrorCodeInfo(
+              sharedName: uniqueNameSuffix == name ? null : name,
+              problemMessage: code.message,
+              correctionMessage: code.correction,
+              isUnresolvedIdentifier: code.isUnresolvedIdentifier,
+              hasPublishedDocs: code.hasPublishedDocs,
+              comment: documentationComment,
+              documentation: otherComment)
+          .toYaml();
     }
   }
   String encodedYaml = _encodeYaml(yaml);
diff --git a/pkg/analyzer/tool/messages/generate.dart b/pkg/analyzer/tool/messages/generate.dart
index 15c7f35..ac733b9 100644
--- a/pkg/analyzer/tool/messages/generate.dart
+++ b/pkg/analyzer/tool/messages/generate.dart
@@ -29,7 +29,6 @@
   await GeneratedContent.generateAll(analyzerPkgPath, allTargets);
 
   _SyntacticErrorGenerator()
-    ..generateFormatCode()
     ..checkForManualChanges()
     ..printSummary();
 }
@@ -82,7 +81,7 @@
       type: 'HINT',
       extraImports: ['package:analyzer/src/error/analyzer_error_code.dart']),
   _ErrorClassInfo(
-      // TODO(paulberry): merge with `syntactic_errors.g.dart`.
+      // TODO(paulberry): rename to `syntactic_errors.g.dart`.
       filePath: 'lib/src/dart/error/syntactic_errors.analyzer.g.dart',
       name: 'ParserErrorCode',
       type: 'SYNTACTIC_ERROR',
@@ -101,16 +100,7 @@
 ];
 
 /// A list of all targets generated by this code generator.
-final List<GeneratedContent> allTargets = <GeneratedContent>[
-  GeneratedFile('lib/src/dart/error/syntactic_errors.g.dart',
-      (String pkgPath) async {
-    final codeGenerator = _SyntacticErrorGenerator();
-
-    codeGenerator.generateFormatCode();
-    return codeGenerator.out.toString();
-  }),
-  ..._analyzerGeneratedFiles(),
-];
+final List<GeneratedContent> allTargets = _analyzerGeneratedFiles();
 
 /// The path to the `analyzer` package.
 final String analyzerPkgPath =
@@ -124,6 +114,9 @@
 final Map<String, Map<String, ErrorCodeInfo>> _analyzerMessages =
     _loadAnalyzerMessages();
 
+/// Decoded messages from the front end's `messages.yaml` file.
+final Map<String, ErrorCodeInfo> _frontEndMessages = _loadFrontEndMessages();
+
 /// Generates a list of [GeneratedContent] objects describing all the analyzer
 /// files that need to be generated.
 List<GeneratedContent> _analyzerGeneratedFiles() {
@@ -148,9 +141,18 @@
   return decodeAnalyzerMessagesYaml(messagesYaml);
 }
 
+/// Loads front end messages from the front end's `messages.yaml` file.
+Map<String, ErrorCodeInfo> _loadFrontEndMessages() {
+  Map<dynamic, dynamic> messagesYaml =
+      loadYaml(File(join(frontEndPkgPath, 'messages.yaml')).readAsStringSync());
+  return decodeCfeMessagesYaml(messagesYaml);
+}
+
 /// Code generator for analyzer error classes.
 class _AnalyzerErrorGenerator {
   final List<_ErrorClassInfo> errorClasses;
+  final CfeToAnalyzerErrorCodeTables tables =
+      CfeToAnalyzerErrorCodeTables(_frontEndMessages);
   final out = StringBuffer('''
 // 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
@@ -166,45 +168,42 @@
 
   void generate() {
     var imports = {'package:analyzer/error/error.dart'};
-    var parts = <String>{};
+    bool shouldGenerateFastaAnalyzerErrorCodes = false;
     for (var errorClass in errorClasses) {
       imports.addAll(errorClass.extraImports);
       if (errorClass.includeCfeMessages) {
-        parts.add('syntactic_errors.g.dart');
+        shouldGenerateFastaAnalyzerErrorCodes = true;
       }
     }
     out.writeln();
     for (var importPath in imports.toList()..sort()) {
       out.writeln("import ${json.encode(importPath)};");
     }
-    if (parts.isNotEmpty) {
-      out.writeln();
-      for (var partPath in parts.toList()..sort()) {
-        out.writeln("part ${json.encode(partPath)};");
-      }
-    }
     out.writeln();
     out.writeln("// It is hard to visually separate each code's _doc comment_ "
         "from its published");
     out.writeln('// _documentation comment_ when each is written as an '
         'end-of-line comment.');
     out.writeln('// ignore_for_file: slash_for_doc_comments');
+    if (shouldGenerateFastaAnalyzerErrorCodes) {
+      out.writeln();
+      _generateFastaAnalyzerErrorCodeList();
+    }
     for (var errorClass in errorClasses.toList()
       ..sort((a, b) => a.name.compareTo(b.name))) {
       out.writeln();
       out.write('class ${errorClass.name} extends ${errorClass.superclass} {');
-      for (var entry in _analyzerMessages[errorClass.name]!.entries.toList()
-        ..sort((a, b) => a.key.compareTo(b.key))) {
+      var entries = [
+        ..._analyzerMessages[errorClass.name]!.entries,
+        if (errorClass.includeCfeMessages) ...tables.analyzerCodeToInfo.entries
+      ];
+      for (var entry in entries..sort((a, b) => a.key.compareTo(b.key))) {
         var errorName = entry.key;
         var errorCodeInfo = entry.value;
         out.writeln();
         out.write(errorCodeInfo.toAnalyzerComments(indent: '  '));
         out.writeln('  static const ${errorClass.name} $errorName =');
-        if (errorCodeInfo.copyFromCfe) {
-          out.writeln('  _$errorName;');
-        } else {
-          out.writeln(errorCodeInfo.toAnalyzerCode(errorClass.name, errorName));
-        }
+        out.writeln(errorCodeInfo.toAnalyzerCode(errorClass.name, errorName));
       }
       out.writeln();
       out.writeln('/// Initialize a newly created error code to have the given '
@@ -232,6 +231,15 @@
       out.writeln('}');
     }
   }
+
+  void _generateFastaAnalyzerErrorCodeList() {
+    out.writeln('final fastaAnalyzerErrorCodes = <ErrorCode?>[');
+    for (var entry in tables.indexToInfo) {
+      var name = tables.infoToAnalyzerCode[entry];
+      out.writeln('${name == null ? 'null' : 'ParserErrorCode.$name'},');
+    }
+    out.writeln('];');
+  }
 }
 
 class _ErrorClassInfo {
@@ -276,16 +284,6 @@
   final Map<String, Map<String, ErrorCodeInfo>> analyzerMessages;
   final String errorConverterSource;
   final String parserSource;
-  final out = StringBuffer('''
-//
-// THIS FILE IS GENERATED. DO NOT EDIT.
-//
-// Instead modify 'pkg/front_end/messages.yaml' and run
-// 'dart pkg/analyzer/tool/messages/generate.dart' to update.
-
-part of 'syntactic_errors.analyzer.g.dart';
-
-''');
 
   factory _SyntacticErrorGenerator() {
     String frontEndPkgPath = normalize(join(pkg_root.packageRoot, 'front_end'));
@@ -341,43 +339,17 @@
     }
   }
 
-  void generateErrorCodes() {
-    final entryMap = tables.analyzerCodeToInfo;
-    for (var errorCode in entryMap.keys.toList()..sort()) {
-      final entry = entryMap[errorCode]!;
-      final className = 'ParserErrorCode';
-      out.writeln();
-      out.writeln('const $className _$errorCode =');
-      out.writeln(entry.toAnalyzerCode(className, errorCode));
-    }
-  }
-
-  void generateFastaAnalyzerErrorCodeList() {
-    out.writeln('final fastaAnalyzerErrorCodes = <ErrorCode?>[');
-    for (var entry in tables.indexToInfo) {
-      var name = tables.infoToAnalyzerCode[entry];
-      out.writeln('${name == null ? 'null' : '_$name'},');
-    }
-    out.writeln('];');
-  }
-
-  void generateFormatCode() {
-    generateFastaAnalyzerErrorCodeList();
-    generateErrorCodes();
-  }
-
   void printSummary() {
     // Build a map of error message to ParserErrorCode
     final messageToName = <String, String>{};
     for (var entry in analyzerMessages['ParserErrorCode']!.entries) {
-      if (entry.value.copyFromCfe) continue;
       String message =
-          entry.value.problemMessage!.replaceAll(RegExp(r'\{\d+\}'), '');
+          entry.value.problemMessage.replaceAll(RegExp(r'\{\d+\}'), '');
       messageToName[message] = entry.key;
     }
 
     String messageFromEntryTemplate(ErrorCodeInfo entry) {
-      String problemMessage = entry.problemMessage!;
+      String problemMessage = entry.problemMessage;
       String message = problemMessage.replaceAll(RegExp(r'#\w+'), '');
       return message;
     }
@@ -453,7 +425,7 @@
           // TODO(paulberry): handle multiple analyzer codes
           if (entry.index == null && entry.analyzerCode.length == 1) {
             analyzerCode = entry.analyzerCode.single;
-            problemMessage = entry.problemMessage!;
+            problemMessage = entry.problemMessage;
           }
         }
         print('  ${fastaErrorCode.padRight(30)} --> $analyzerCode'
diff --git a/pkg/analyzer/tool/summary/mini_ast.dart b/pkg/analyzer/tool/summary/mini_ast.dart
index b7ded86..ecf9036 100644
--- a/pkg/analyzer/tool/summary/mini_ast.dart
+++ b/pkg/analyzer/tool/summary/mini_ast.dart
@@ -582,7 +582,7 @@
 
   @override
   internalProblem(Message message, int charOffset, Uri? uri) {
-    throw UnsupportedError(message.message);
+    throw UnsupportedError(message.problemMessage);
   }
 
   List? popList(int n, List list) {
diff --git a/pkg/compiler/lib/src/ir/modular.dart b/pkg/compiler/lib/src/ir/modular.dart
index a924f16..e9df381 100644
--- a/pkg/compiler/lib/src/ir/modular.dart
+++ b/pkg/compiler/lib/src/ir/modular.dart
@@ -141,5 +141,5 @@
   var sourceSpan = SourceSpan(
       message.uri, message.charOffset, message.charOffset + message.length);
   return reporter.createMessage(
-      sourceSpan, MessageKind.GENERIC, {'text': message.message});
+      sourceSpan, MessageKind.GENERIC, {'text': message.problemMessage});
 }
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 1647344..0bd2619 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -2168,7 +2168,7 @@
   SourceSpan sourceSpan = SourceSpan(
       message.uri, message.charOffset, message.charOffset + message.length);
   return reporter.createMessage(
-      sourceSpan, MessageKind.GENERIC, {'text': message.message});
+      sourceSpan, MessageKind.GENERIC, {'text': message.problemMessage});
 }
 
 void reportLocatedMessage(DiagnosticReporter reporter,
diff --git a/pkg/compiler/test/end_to_end/user_crash_test.dart b/pkg/compiler/test/end_to_end/user_crash_test.dart
index ab7f26f..6dfea6d 100644
--- a/pkg/compiler/test/end_to_end/user_crash_test.dart
+++ b/pkg/compiler/test/end_to_end/user_crash_test.dart
@@ -31,8 +31,8 @@
     var cantReadFile =
         templateCantReadFile.withArguments(entryPoint, EXCEPTION);
     List<String> expectedLines = [
-      "Error: ${cantReadFile.message}",
-      "Error: ${messageMissingMain.message}",
+      "Error: ${cantReadFile.problemMessage}",
+      "Error: ${messageMissingMain.problemMessage}",
     ];
     test('Throw in input provider',
         await run(memorySourceFiles: new CrashingMap()),
diff --git a/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart b/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
index 8d195b3..fa46af3 100644
--- a/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/expression_compiler.dart
@@ -38,7 +38,7 @@
 
 DiagnosticMessage _createInternalError(Uri uri, int line, int col, String msg) {
   return Message(Code<String>('Expression Compiler Internal error'),
-          message: msg)
+          problemMessage: msg)
       .withLocation(uri, 0, 0)
       .withFormatting(PlainAndColorizedString.plainOnly('Internal error: $msg'),
           line, col, Severity.internalProblem, []);
diff --git a/pkg/front_end/lib/src/api_prototype/compiler_options.dart b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
index 370f581..7f14df8 100644
--- a/pkg/front_end/lib/src/api_prototype/compiler_options.dart
+++ b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
@@ -126,6 +126,8 @@
   Map<ExperimentalFlag, Version>? experimentEnabledVersionForTesting;
   Map<ExperimentalFlag, Version>? experimentReleasedVersionForTesting;
 
+  bool enableUnscheduledExperiments = false;
+
   /// Environment map used when evaluating `bool.fromEnvironment`,
   /// `int.fromEnvironment` and `String.fromEnvironment` during constant
   /// evaluation. If the map is `null`, all environment constants will be left
@@ -357,6 +359,9 @@
     if (currentSdkVersion != other.currentSdkVersion) return false;
     if (emitDeps != other.emitDeps) return false;
     if (!equalSets(invocationModes, other.invocationModes)) return false;
+    if (enableUnscheduledExperiments != other.enableUnscheduledExperiments) {
+      return false;
+    }
 
     return true;
   }
diff --git a/pkg/front_end/lib/src/base/command_line_options.dart b/pkg/front_end/lib/src/base/command_line_options.dart
index 46aabec..a8c7e9b 100644
--- a/pkg/front_end/lib/src/base/command_line_options.dart
+++ b/pkg/front_end/lib/src/base/command_line_options.dart
@@ -29,6 +29,8 @@
   static const String compileSdk = "--compile-sdk";
   static const String dumpIr = "--dump-ir";
   static const String enableExperiment = "--enable-experiment";
+  static const String enableUnscheduledExperiments =
+      "--enable-unscheduled-experiments";
   static const String excludeSource = "--exclude-source";
   static const String omitPlatform = "--omit-platform";
   static const String fatal = "--fatal";
@@ -59,6 +61,8 @@
       const Option(Flags.dumpIr, const BoolValue(false));
   static const Option<List<String>?> enableExperiment =
       const Option(Flags.enableExperiment, const StringListValue());
+  static const Option<bool> enableUnscheduledExperiments =
+      const Option(Flags.enableUnscheduledExperiments, const BoolValue(false));
   static const Option<bool> excludeSource =
       const Option(Flags.excludeSource, const BoolValue(false));
   static const Option<bool> omitPlatform =
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index e6a3ec0..de2886d 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -186,6 +186,8 @@
 
   bool get warnOnReachabilityCheck => _raw.warnOnReachabilityCheck;
 
+  bool get enableUnscheduledExperiments => _raw.enableUnscheduledExperiments;
+
   /// The entry-points provided to the compiler.
   final List<Uri> inputs;
 
@@ -249,7 +251,7 @@
       if (_raw.skipForDebugging < 0) {
         print(templateDebugTrace
             .withArguments("$severity", "${StackTrace.current}")
-            .message);
+            .problemMessage);
       } else {
         throw new DebugAbort(
             message.uri, message.charOffset, severity, StackTrace.current);
@@ -604,7 +606,7 @@
       // We throw a new exception to ensure that the message include the uri
       // that led to the exception. Exceptions in Uri don't include the
       // offending uri in the exception message.
-      throw new ArgumentError(message.message);
+      throw new ArgumentError(message.problemMessage);
     }
     return null;
   }
@@ -727,7 +729,7 @@
         // We throw a new exception to ensure that the message include the uri
         // that led to the exception. Exceptions in Uri don't include the
         // offending uri in the exception message.
-        throw new ArgumentError(message.message);
+        throw new ArgumentError(message.problemMessage);
       }
     }
 
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index e893019..9c90805 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -604,7 +604,7 @@
       return unhandled(
           templateTypeArgumentMismatch
               .withArguments(typeVariablesCount)
-              .message,
+              .problemMessage,
           "buildTypeArguments",
           -1,
           null);
diff --git a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
index 4ac03ac..8460e59 100644
--- a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart
@@ -137,7 +137,7 @@
       return unhandled(
           templateTypeArgumentMismatch
               .withArguments(typeVariablesCount)
-              .message,
+              .problemMessage,
           "buildTypeArguments",
           -1,
           null);
diff --git a/pkg/front_end/lib/src/fasta/builder/factory_builder.dart b/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
index d19bcde..2561223 100644
--- a/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
@@ -401,7 +401,7 @@
         unhandled("${targetBuilder.runtimeType}", "buildOutlineExpressions",
             charOffset, fileUri);
       }
-      Arguments targetInvocationArguments;
+      ArgumentsImpl targetInvocationArguments;
       {
         List<Expression> positionalArguments = <Expression>[];
         for (VariableDeclaration parameter
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index df0d819..57c61dd 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -426,8 +426,14 @@
     _fieldEncoding.completeSignature(coreTypes);
 
     for (Annotatable annotatable in _fieldEncoding.annotatables) {
-      MetadataBuilder.buildAnnotations(annotatable, metadata, library,
-          classBuilder, this, fileUri, classBuilder?.scope ?? library.scope);
+      MetadataBuilder.buildAnnotations(
+          annotatable,
+          metadata,
+          library,
+          declarationBuilder,
+          this,
+          fileUri,
+          declarationBuilder?.scope ?? library.scope);
     }
 
     // For modular compilation we need to include initializers of all const
@@ -439,10 +445,10 @@
                 isClassMember &&
                 classBuilder!.declaresConstConstructor)) &&
         _constInitializerToken != null) {
-      Scope scope = classBuilder?.scope ?? library.scope;
+      Scope scope = declarationBuilder?.scope ?? library.scope;
       BodyBuilder bodyBuilder = library.loader
           .createBodyBuilderForOutlineExpression(
-              library, classBuilder, this, scope, fileUri);
+              library, declarationBuilder, this, scope, fileUri);
       bodyBuilder.constantContext =
           isConst ? ConstantContext.inferred : ConstantContext.required;
       Expression initializer = bodyBuilder.typeInferrer.inferFieldInitializer(
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index 772314b..9035466 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -207,6 +207,11 @@
     return buffer;
   }
 
+  /// The builder for the enclosing class or extension, if any.
+  DeclarationBuilder? get declarationBuilder =>
+      parent is DeclarationBuilder ? parent as DeclarationBuilder : null;
+
+  /// The builder for the enclosing class, if any.
   ClassBuilder? get classBuilder =>
       parent is ClassBuilder ? parent as ClassBuilder : null;
 }
diff --git a/pkg/front_end/lib/src/fasta/command_line_reporting.dart b/pkg/front_end/lib/src/fasta/command_line_reporting.dart
index 9cb19b4..d3bf0bf 100644
--- a/pkg/front_end/lib/src/fasta/command_line_reporting.dart
+++ b/pkg/front_end/lib/src/fasta/command_line_reporting.dart
@@ -53,10 +53,11 @@
       length = 1;
     }
     String? prefix = severityPrefixes[severity];
-    String messageTextTmp =
-        prefix == null ? message.message : "$prefix: ${message.message}";
-    if (message.tip != null) {
-      messageTextTmp += "\n${message.tip}";
+    String messageTextTmp = prefix == null
+        ? message.problemMessage
+        : "$prefix: ${message.problemMessage}";
+    if (message.correctionMessage != null) {
+      messageTextTmp += "\n${message.correctionMessage}";
     }
     final String messageTextPlain = messageTextTmp;
     String messageTextColorized;
@@ -106,7 +107,7 @@
     }
   } catch (error, trace) {
     print("Crash when formatting: "
-        "[${message.code.name}] ${safeToString(message.message)}\n"
+        "[${message.code.name}] ${safeToString(message.problemMessage)}\n"
         "${safeToString(error)}\n"
         "$trace");
     throw new Crash(message.uri, message.charOffset, error, trace);
diff --git a/pkg/front_end/lib/src/fasta/compiler_context.dart b/pkg/front_end/lib/src/fasta/compiler_context.dart
index a3a99e1..5960574 100644
--- a/pkg/front_end/lib/src/fasta/compiler_context.dart
+++ b/pkg/front_end/lib/src/fasta/compiler_context.dart
@@ -100,9 +100,11 @@
     if (context == null) {
       // Note: we throw directly and don't use internalProblem, because
       // internalProblem depends on having a compiler context available.
-      String message = messageInternalProblemMissingContext.message;
-      String tip = messageInternalProblemMissingContext.tip!;
-      throw "Internal problem: $message\nTip: $tip";
+      String problemMessage =
+          messageInternalProblemMissingContext.problemMessage;
+      String correctionMessage =
+          messageInternalProblemMissingContext.correctionMessage!;
+      throw "Internal problem: $problemMessage\nTip: $correctionMessage";
     }
     return context;
   }
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
index 3598ae5..3a4bdc0 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
@@ -172,7 +172,7 @@
       double ms = elapsed.inMicroseconds / Duration.microsecondsPerMillisecond;
       Message message = template.withArguments(
           libraryCount, byteCount, ms, byteCount / ms, ms / libraryCount);
-      print("$sinceStart: ${message.message}");
+      print("$sinceStart: ${message.problemMessage}");
     });
   }
 
@@ -218,7 +218,7 @@
     severity ??= message.code.severity;
     if (severity == Severity.ignored) return null;
     String trace = """
-message: ${message.message}
+message: ${message.problemMessage}
 charOffset: $charOffset
 fileUri: $fileUri
 severity: $severity
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
index 5674281..53468ab 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
@@ -20,9 +20,9 @@
             isNonNullableByDefault)> templateAmbiguousExtensionMethod = const Template<
         Message Function(
             String name, DartType _type, bool isNonNullableByDefault)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The method '#name' is defined in multiple extensions for '#type' and neither is more specific.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
     withArguments: _withArgumentsAmbiguousExtensionMethod);
 
@@ -43,10 +43,10 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeAmbiguousExtensionMethod,
-      message:
+      problemMessage:
           """The method '${name}' is defined in multiple extensions for '${type}' and neither is more specific.""" +
               labeler.originMessages,
-      tip: """Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
+      correctionMessage: """Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
       arguments: {'name': name, 'type': _type});
 }
 
@@ -57,9 +57,9 @@
     templateAmbiguousExtensionOperator = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The operator '#name' is defined in multiple extensions for '#type' and neither is more specific.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
         withArguments: _withArgumentsAmbiguousExtensionOperator);
 
@@ -82,10 +82,10 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeAmbiguousExtensionOperator,
-      message:
+      problemMessage:
           """The operator '${name}' is defined in multiple extensions for '${type}' and neither is more specific.""" +
               labeler.originMessages,
-      tip: """Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
+      correctionMessage: """Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
       arguments: {'name': name, 'type': _type});
 }
 
@@ -96,9 +96,9 @@
     templateAmbiguousExtensionProperty = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The property '#name' is defined in multiple extensions for '#type' and neither is more specific.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
         withArguments: _withArgumentsAmbiguousExtensionProperty);
 
@@ -121,10 +121,10 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeAmbiguousExtensionProperty,
-      message:
+      problemMessage:
           """The property '${name}' is defined in multiple extensions for '${type}' and neither is more specific.""" +
               labeler.originMessages,
-      tip: """Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
+      correctionMessage: """Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
       arguments: {'name': name, 'type': _type});
 }
 
@@ -135,7 +135,7 @@
     const Template<
             Message Function(String name, DartType _type, DartType _type2,
                 bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""'#name' can't implement both '#type' and '#type2'""",
         withArguments: _withArgumentsAmbiguousSupertypes);
 
@@ -159,8 +159,9 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeAmbiguousSupertypes,
-      message: """'${name}' can't implement both '${type}' and '${type2}'""" +
-          labeler.originMessages,
+      problemMessage:
+          """'${name}' can't implement both '${type}' and '${type2}'""" +
+              labeler.originMessages,
       arguments: {'name': name, 'type': _type, 'type2': _type2});
 }
 
@@ -171,7 +172,7 @@
     templateArgumentTypeNotAssignable = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The argument type '#type' can't be assigned to the parameter type '#type2'.""",
         withArguments: _withArgumentsArgumentTypeNotAssignable);
 
@@ -194,7 +195,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeArgumentTypeNotAssignable,
-      message:
+      problemMessage:
           """The argument type '${type}' can't be assigned to the parameter type '${type2}'.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -207,7 +208,7 @@
     templateArgumentTypeNotAssignableNullability = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The argument type '#type' can't be assigned to the parameter type '#type2' because '#type' is nullable and '#type2' isn't.""",
         withArguments: _withArgumentsArgumentTypeNotAssignableNullability);
 
@@ -230,7 +231,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeArgumentTypeNotAssignableNullability,
-      message:
+      problemMessage:
           """The argument type '${type}' can't be assigned to the parameter type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -240,7 +241,7 @@
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateArgumentTypeNotAssignableNullabilityNull = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The value 'null' can't be assigned to the parameter type '#type' because '#type' is not nullable.""",
         withArguments: _withArgumentsArgumentTypeNotAssignableNullabilityNull);
 
@@ -258,7 +259,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeArgumentTypeNotAssignableNullabilityNull,
-      message:
+      problemMessage:
           """The value 'null' can't be assigned to the parameter type '${type}' because '${type}' is not nullable.""" +
               labeler.originMessages,
       arguments: {'type': _type});
@@ -271,7 +272,7 @@
     templateArgumentTypeNotAssignableNullabilityNullType = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The argument type '#type' can't be assigned to the parameter type '#type2' because '#type2' is not nullable.""",
         withArguments:
             _withArgumentsArgumentTypeNotAssignableNullabilityNullType);
@@ -295,7 +296,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeArgumentTypeNotAssignableNullabilityNullType,
-      message:
+      problemMessage:
           """The argument type '${type}' can't be assigned to the parameter type '${type2}' because '${type2}' is not nullable.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -308,7 +309,7 @@
     templateArgumentTypeNotAssignablePartNullability = const Template<
             Message Function(DartType _type, DartType _type2, DartType _type3,
                 DartType _type4, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The argument type '#type' can't be assigned to the parameter type '#type2' because '#type3' is nullable and '#type4' isn't.""",
         withArguments: _withArgumentsArgumentTypeNotAssignablePartNullability);
 
@@ -339,7 +340,7 @@
   String type3 = type3Parts.join();
   String type4 = type4Parts.join();
   return new Message(codeArgumentTypeNotAssignablePartNullability,
-      message:
+      problemMessage:
           """The argument type '${type}' can't be assigned to the parameter type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
               labeler.originMessages,
       arguments: {
@@ -355,7 +356,7 @@
         Message Function(Constant _constant, bool isNonNullableByDefault)>
     templateConstEvalCaseImplementsEqual = const Template<
             Message Function(Constant _constant, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Case expression '#constant' does not have a primitive operator '=='.""",
         withArguments: _withArgumentsConstEvalCaseImplementsEqual);
 
@@ -373,7 +374,7 @@
   List<Object> constantParts = labeler.labelConstant(_constant);
   String constant = constantParts.join();
   return new Message(codeConstEvalCaseImplementsEqual,
-      message:
+      problemMessage:
           """Case expression '${constant}' does not have a primitive operator '=='.""" +
               labeler.originMessages,
       arguments: {'constant': _constant});
@@ -384,7 +385,7 @@
         Message Function(Constant _constant, bool isNonNullableByDefault)>
     templateConstEvalDuplicateElement = const Template<
             Message Function(Constant _constant, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The element '#constant' conflicts with another existing element in the set.""",
         withArguments: _withArgumentsConstEvalDuplicateElement);
 
@@ -402,7 +403,7 @@
   List<Object> constantParts = labeler.labelConstant(_constant);
   String constant = constantParts.join();
   return new Message(codeConstEvalDuplicateElement,
-      message:
+      problemMessage:
           """The element '${constant}' conflicts with another existing element in the set.""" +
               labeler.originMessages,
       arguments: {'constant': _constant});
@@ -413,7 +414,7 @@
         Message Function(Constant _constant, bool isNonNullableByDefault)>
     templateConstEvalDuplicateKey = const Template<
             Message Function(Constant _constant, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The key '#constant' conflicts with another existing key in the map.""",
         withArguments: _withArgumentsConstEvalDuplicateKey);
 
@@ -431,7 +432,7 @@
   List<Object> constantParts = labeler.labelConstant(_constant);
   String constant = constantParts.join();
   return new Message(codeConstEvalDuplicateKey,
-      message:
+      problemMessage:
           """The key '${constant}' conflicts with another existing key in the map.""" +
               labeler.originMessages,
       arguments: {'constant': _constant});
@@ -442,7 +443,7 @@
         Message Function(Constant _constant, bool isNonNullableByDefault)>
     templateConstEvalElementImplementsEqual = const Template<
             Message Function(Constant _constant, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The element '#constant' does not have a primitive operator '=='.""",
         withArguments: _withArgumentsConstEvalElementImplementsEqual);
 
@@ -460,7 +461,7 @@
   List<Object> constantParts = labeler.labelConstant(_constant);
   String constant = constantParts.join();
   return new Message(codeConstEvalElementImplementsEqual,
-      message:
+      problemMessage:
           """The element '${constant}' does not have a primitive operator '=='.""" +
               labeler.originMessages,
       arguments: {'constant': _constant});
@@ -470,7 +471,7 @@
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateConstEvalFreeTypeParameter = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' is not a constant because it depends on a type parameter, only instantiated types are allowed.""",
         withArguments: _withArgumentsConstEvalFreeTypeParameter);
 
@@ -488,7 +489,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeConstEvalFreeTypeParameter,
-      message:
+      problemMessage:
           """The type '${type}' is not a constant because it depends on a type parameter, only instantiated types are allowed.""" +
               labeler.originMessages,
       arguments: {'type': _type});
@@ -501,7 +502,7 @@
     templateConstEvalInvalidBinaryOperandType = const Template<
             Message Function(String stringOKEmpty, Constant _constant,
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Binary operator '#stringOKEmpty' on '#constant' requires operand of type '#type', but was of type '#type2'.""",
         withArguments: _withArgumentsConstEvalInvalidBinaryOperandType);
 
@@ -532,7 +533,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeConstEvalInvalidBinaryOperandType,
-      message:
+      problemMessage:
           """Binary operator '${stringOKEmpty}' on '${constant}' requires operand of type '${type}', but was of type '${type2}'.""" +
               labeler.originMessages,
       arguments: {
@@ -550,7 +551,7 @@
     templateConstEvalInvalidEqualsOperandType = const Template<
             Message Function(Constant _constant, DartType _type,
                 bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Binary operator '==' requires receiver constant '#constant' of type 'Null', 'bool', 'int', 'double', or 'String', but was of type '#type'.""",
         withArguments: _withArgumentsConstEvalInvalidEqualsOperandType);
 
@@ -573,7 +574,7 @@
   String constant = constantParts.join();
   String type = typeParts.join();
   return new Message(codeConstEvalInvalidEqualsOperandType,
-      message:
+      problemMessage:
           """Binary operator '==' requires receiver constant '${constant}' of type 'Null', 'bool', 'int', 'double', or 'String', but was of type '${type}'.""" +
               labeler.originMessages,
       arguments: {'constant': _constant, 'type': _type});
@@ -584,9 +585,12 @@
         Message Function(String stringOKEmpty, Constant _constant,
             bool isNonNullableByDefault)>
     templateConstEvalInvalidMethodInvocation = const Template<
-            Message Function(String stringOKEmpty, Constant _constant,
-                bool isNonNullableByDefault)>(
-        messageTemplate:
+            Message Function(
+                String stringOKEmpty,
+                Constant _constant,
+                bool
+                    isNonNullableByDefault)>(
+        problemMessageTemplate:
             r"""The method '#stringOKEmpty' can't be invoked on '#constant' in a constant expression.""",
         withArguments: _withArgumentsConstEvalInvalidMethodInvocation);
 
@@ -609,7 +613,7 @@
   List<Object> constantParts = labeler.labelConstant(_constant);
   String constant = constantParts.join();
   return new Message(codeConstEvalInvalidMethodInvocation,
-      message:
+      problemMessage:
           """The method '${stringOKEmpty}' can't be invoked on '${constant}' in a constant expression.""" +
               labeler.originMessages,
       arguments: {'stringOKEmpty': stringOKEmpty, 'constant': _constant});
@@ -620,9 +624,12 @@
         Message Function(String stringOKEmpty, Constant _constant,
             bool isNonNullableByDefault)> templateConstEvalInvalidPropertyGet =
     const Template<
-            Message Function(String stringOKEmpty, Constant _constant,
-                bool isNonNullableByDefault)>(
-        messageTemplate:
+            Message Function(
+                String stringOKEmpty,
+                Constant _constant,
+                bool
+                    isNonNullableByDefault)>(
+        problemMessageTemplate:
             r"""The property '#stringOKEmpty' can't be accessed on '#constant' in a constant expression.""",
         withArguments: _withArgumentsConstEvalInvalidPropertyGet);
 
@@ -644,7 +651,7 @@
   List<Object> constantParts = labeler.labelConstant(_constant);
   String constant = constantParts.join();
   return new Message(codeConstEvalInvalidPropertyGet,
-      message:
+      problemMessage:
           """The property '${stringOKEmpty}' can't be accessed on '${constant}' in a constant expression.""" +
               labeler.originMessages,
       arguments: {'stringOKEmpty': stringOKEmpty, 'constant': _constant});
@@ -655,7 +662,7 @@
         Message Function(Constant _constant, bool isNonNullableByDefault)>
     templateConstEvalInvalidStringInterpolationOperand = const Template<
             Message Function(Constant _constant, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The constant value '#constant' can't be used as part of a string interpolation in a constant expression.
 Only values of type 'null', 'bool', 'int', 'double', or 'String' can be used.""",
         withArguments:
@@ -675,7 +682,7 @@
   List<Object> constantParts = labeler.labelConstant(_constant);
   String constant = constantParts.join();
   return new Message(codeConstEvalInvalidStringInterpolationOperand,
-      message:
+      problemMessage:
           """The constant value '${constant}' can't be used as part of a string interpolation in a constant expression.
 Only values of type 'null', 'bool', 'int', 'double', or 'String' can be used.""" +
               labeler.originMessages,
@@ -687,7 +694,7 @@
         Message Function(Constant _constant, bool isNonNullableByDefault)>
     templateConstEvalInvalidSymbolName = const Template<
             Message Function(Constant _constant, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '#constant'.""",
         withArguments: _withArgumentsConstEvalInvalidSymbolName);
 
@@ -705,7 +712,7 @@
   List<Object> constantParts = labeler.labelConstant(_constant);
   String constant = constantParts.join();
   return new Message(codeConstEvalInvalidSymbolName,
-      message:
+      problemMessage:
           """The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '${constant}'.""" +
               labeler.originMessages,
       arguments: {'constant': _constant});
@@ -721,7 +728,7 @@
             isNonNullableByDefault)> templateConstEvalInvalidType = const Template<
         Message Function(Constant _constant, DartType _type, DartType _type2,
             bool isNonNullableByDefault)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Expected constant '#constant' to be of type '#type', but was of type '#type2'.""",
     withArguments: _withArgumentsConstEvalInvalidType);
 
@@ -745,7 +752,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeConstEvalInvalidType,
-      message:
+      problemMessage:
           """Expected constant '${constant}' to be of type '${type}', but was of type '${type2}'.""" +
               labeler.originMessages,
       arguments: {'constant': _constant, 'type': _type, 'type2': _type2});
@@ -756,7 +763,7 @@
         Message Function(Constant _constant, bool isNonNullableByDefault)>
     templateConstEvalKeyImplementsEqual = const Template<
             Message Function(Constant _constant, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The key '#constant' does not have a primitive operator '=='.""",
         withArguments: _withArgumentsConstEvalKeyImplementsEqual);
 
@@ -776,7 +783,7 @@
   List<Object> constantParts = labeler.labelConstant(_constant);
   String constant = constantParts.join();
   return new Message(codeConstEvalKeyImplementsEqual,
-      message:
+      problemMessage:
           """The key '${constant}' does not have a primitive operator '=='.""" +
               labeler.originMessages,
       arguments: {'constant': _constant});
@@ -787,7 +794,7 @@
         Message Function(Constant _constant, bool isNonNullableByDefault)>
     templateConstEvalUnhandledException = const Template<
             Message Function(Constant _constant, bool isNonNullableByDefault)>(
-        messageTemplate: r"""Unhandled exception: #constant""",
+        problemMessageTemplate: r"""Unhandled exception: #constant""",
         withArguments: _withArgumentsConstEvalUnhandledException);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -804,7 +811,8 @@
   List<Object> constantParts = labeler.labelConstant(_constant);
   String constant = constantParts.join();
   return new Message(codeConstEvalUnhandledException,
-      message: """Unhandled exception: ${constant}""" + labeler.originMessages,
+      problemMessage:
+          """Unhandled exception: ${constant}""" + labeler.originMessages,
       arguments: {'constant': _constant});
 }
 
@@ -817,9 +825,9 @@
             isNonNullableByDefault)> templateDeferredTypeAnnotation = const Template<
         Message Function(
             DartType _type, String name, bool isNonNullableByDefault)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The type '#type' is deferred loaded via prefix '#name' and can't be used as a type annotation.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try removing 'deferred' from the import of '#name' or use a supertype of '#type' that isn't deferred.""",
     withArguments: _withArgumentsDeferredTypeAnnotation);
 
@@ -842,10 +850,10 @@
   name = demangleMixinApplicationName(name);
   String type = typeParts.join();
   return new Message(codeDeferredTypeAnnotation,
-      message:
+      problemMessage:
           """The type '${type}' is deferred loaded via prefix '${name}' and can't be used as a type annotation.""" +
               labeler.originMessages,
-      tip: """Try removing 'deferred' from the import of '${name}' or use a supertype of '${type}' that isn't deferred.""",
+      correctionMessage: """Try removing 'deferred' from the import of '${name}' or use a supertype of '${type}' that isn't deferred.""",
       arguments: {'type': _type, 'name': name});
 }
 
@@ -856,7 +864,8 @@
     templateFfiDartTypeMismatch = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate: r"""Expected '#type' to be a subtype of '#type2'.""",
+        problemMessageTemplate:
+            r"""Expected '#type' to be a subtype of '#type2'.""",
         withArguments: _withArgumentsFfiDartTypeMismatch);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -878,7 +887,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeFfiDartTypeMismatch,
-      message: """Expected '${type}' to be a subtype of '${type2}'.""" +
+      problemMessage: """Expected '${type}' to be a subtype of '${type2}'.""" +
           labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
 }
@@ -887,7 +896,7 @@
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateFfiExpectedExceptionalReturn = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Expected an exceptional return value for a native callback returning '#type'.""",
         withArguments: _withArgumentsFfiExpectedExceptionalReturn);
 
@@ -905,7 +914,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeFfiExpectedExceptionalReturn,
-      message:
+      problemMessage:
           """Expected an exceptional return value for a native callback returning '${type}'.""" +
               labeler.originMessages,
       arguments: {'type': _type});
@@ -915,7 +924,7 @@
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateFfiExpectedNoExceptionalReturn = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Exceptional return value cannot be provided for a native callback returning '#type'.""",
         withArguments: _withArgumentsFfiExpectedNoExceptionalReturn);
 
@@ -933,7 +942,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeFfiExpectedNoExceptionalReturn,
-      message:
+      problemMessage:
           """Exceptional return value cannot be provided for a native callback returning '${type}'.""" +
               labeler.originMessages,
       arguments: {'type': _type});
@@ -946,7 +955,7 @@
         bool
             isNonNullableByDefault)> templateFfiTypeInvalid = const Template<
         Message Function(DartType _type, bool isNonNullableByDefault)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Expected type '#type' to be a valid and instantiated subtype of 'NativeType'.""",
     withArguments: _withArgumentsFfiTypeInvalid);
 
@@ -964,7 +973,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeFfiTypeInvalid,
-      message:
+      problemMessage:
           """Expected type '${type}' to be a valid and instantiated subtype of 'NativeType'.""" +
               labeler.originMessages,
       arguments: {'type': _type});
@@ -980,7 +989,7 @@
             isNonNullableByDefault)> templateFfiTypeMismatch = const Template<
         Message Function(DartType _type, DartType _type2, DartType _type3,
             bool isNonNullableByDefault)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Expected type '#type' to be '#type2', which is the Dart type corresponding to '#type3'.""",
     withArguments: _withArgumentsFfiTypeMismatch);
 
@@ -1004,7 +1013,7 @@
   String type2 = type2Parts.join();
   String type3 = type3Parts.join();
   return new Message(codeFfiTypeMismatch,
-      message:
+      problemMessage:
           """Expected type '${type}' to be '${type2}', which is the Dart type corresponding to '${type3}'.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2, 'type3': _type3});
@@ -1017,7 +1026,7 @@
     templateFieldNonNullableNotInitializedByConstructorError = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""This constructor should initialize field '#name' because its type '#type' doesn't allow null.""",
         withArguments:
             _withArgumentsFieldNonNullableNotInitializedByConstructorError);
@@ -1041,7 +1050,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeFieldNonNullableNotInitializedByConstructorError,
-      message:
+      problemMessage:
           """This constructor should initialize field '${name}' because its type '${type}' doesn't allow null.""" +
               labeler.originMessages,
       arguments: {'name': name, 'type': _type});
@@ -1054,7 +1063,7 @@
     templateFieldNonNullableWithoutInitializerError = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Field '#name' should be initialized because its type '#type' doesn't allow null.""",
         withArguments: _withArgumentsFieldNonNullableWithoutInitializerError);
 
@@ -1077,7 +1086,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeFieldNonNullableWithoutInitializerError,
-      message:
+      problemMessage:
           """Field '${name}' should be initialized because its type '${type}' doesn't allow null.""" +
               labeler.originMessages,
       arguments: {'name': name, 'type': _type});
@@ -1090,9 +1099,10 @@
     templateForInLoopElementTypeNotAssignable = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""A value of type '#type' can't be assigned to a variable of type '#type2'.""",
-        tipTemplate: r"""Try changing the type of the variable.""",
+        correctionMessageTemplate:
+            r"""Try changing the type of the variable.""",
         withArguments: _withArgumentsForInLoopElementTypeNotAssignable);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1114,10 +1124,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeForInLoopElementTypeNotAssignable,
-      message:
+      problemMessage:
           """A value of type '${type}' can't be assigned to a variable of type '${type2}'.""" +
               labeler.originMessages,
-      tip: """Try changing the type of the variable.""",
+      correctionMessage: """Try changing the type of the variable.""",
       arguments: {'type': _type, 'type2': _type2});
 }
 
@@ -1128,9 +1138,10 @@
     templateForInLoopElementTypeNotAssignableNullability = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""A value of type '#type' can't be assigned to a variable of type '#type2' because '#type' is nullable and '#type2' isn't.""",
-        tipTemplate: r"""Try changing the type of the variable.""",
+        correctionMessageTemplate:
+            r"""Try changing the type of the variable.""",
         withArguments:
             _withArgumentsForInLoopElementTypeNotAssignableNullability);
 
@@ -1153,10 +1164,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeForInLoopElementTypeNotAssignableNullability,
-      message:
+      problemMessage:
           """A value of type '${type}' can't be assigned to a variable of type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
               labeler.originMessages,
-      tip: """Try changing the type of the variable.""",
+      correctionMessage: """Try changing the type of the variable.""",
       arguments: {'type': _type, 'type2': _type2});
 }
 
@@ -1167,9 +1178,10 @@
     templateForInLoopElementTypeNotAssignablePartNullability = const Template<
             Message Function(DartType _type, DartType _type2, DartType _type3,
                 DartType _type4, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""A value of type '#type' can't be assigned to a variable of type '#type2' because '#type3' is nullable and '#type4' isn't.""",
-        tipTemplate: r"""Try changing the type of the variable.""",
+        correctionMessageTemplate:
+            r"""Try changing the type of the variable.""",
         withArguments:
             _withArgumentsForInLoopElementTypeNotAssignablePartNullability);
 
@@ -1200,10 +1212,10 @@
   String type3 = type3Parts.join();
   String type4 = type4Parts.join();
   return new Message(codeForInLoopElementTypeNotAssignablePartNullability,
-      message:
+      problemMessage:
           """A value of type '${type}' can't be assigned to a variable of type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
               labeler.originMessages,
-      tip: """Try changing the type of the variable.""",
+      correctionMessage: """Try changing the type of the variable.""",
       arguments: {
         'type': _type,
         'type2': _type2,
@@ -1219,7 +1231,7 @@
     templateForInLoopTypeNotIterable = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' used in the 'for' loop must implement '#type2'.""",
         withArguments: _withArgumentsForInLoopTypeNotIterable);
 
@@ -1242,7 +1254,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeForInLoopTypeNotIterable,
-      message:
+      problemMessage:
           """The type '${type}' used in the 'for' loop must implement '${type2}'.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -1255,7 +1267,7 @@
     templateForInLoopTypeNotIterableNullability = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' used in the 'for' loop must implement '#type2' because '#type' is nullable and '#type2' isn't.""",
         withArguments: _withArgumentsForInLoopTypeNotIterableNullability);
 
@@ -1278,7 +1290,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeForInLoopTypeNotIterableNullability,
-      message:
+      problemMessage:
           """The type '${type}' used in the 'for' loop must implement '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -1291,7 +1303,7 @@
     templateForInLoopTypeNotIterablePartNullability = const Template<
             Message Function(DartType _type, DartType _type2, DartType _type3,
                 DartType _type4, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' used in the 'for' loop must implement '#type2' because '#type3' is nullable and '#type4' isn't.""",
         withArguments: _withArgumentsForInLoopTypeNotIterablePartNullability);
 
@@ -1322,7 +1334,7 @@
   String type3 = type3Parts.join();
   String type4 = type4Parts.join();
   return new Message(codeForInLoopTypeNotIterablePartNullability,
-      message:
+      problemMessage:
           """The type '${type}' used in the 'for' loop must implement '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
               labeler.originMessages,
       arguments: {
@@ -1337,9 +1349,9 @@
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateGenericFunctionTypeInferredAsActualTypeArgument = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Generic function type '#type' inferred as a type argument.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try providing a non-generic function type explicitly.""",
         withArguments:
             _withArgumentsGenericFunctionTypeInferredAsActualTypeArgument);
@@ -1358,10 +1370,11 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeGenericFunctionTypeInferredAsActualTypeArgument,
-      message:
+      problemMessage:
           """Generic function type '${type}' inferred as a type argument.""" +
               labeler.originMessages,
-      tip: """Try providing a non-generic function type explicitly.""",
+      correctionMessage:
+          """Try providing a non-generic function type explicitly.""",
       arguments: {'type': _type});
 }
 
@@ -1369,9 +1382,9 @@
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateImplicitCallOfNonMethod = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Cannot invoke an instance of '#type' because it declares 'call' to be something other than a method.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try changing 'call' to a method or explicitly invoke 'call'.""",
         withArguments: _withArgumentsImplicitCallOfNonMethod);
 
@@ -1389,10 +1402,10 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeImplicitCallOfNonMethod,
-      message:
+      problemMessage:
           """Cannot invoke an instance of '${type}' because it declares 'call' to be something other than a method.""" +
               labeler.originMessages,
-      tip: """Try changing 'call' to a method or explicitly invoke 'call'.""",
+      correctionMessage: """Try changing 'call' to a method or explicitly invoke 'call'.""",
       arguments: {'type': _type});
 }
 
@@ -1403,7 +1416,7 @@
         bool
             isNonNullableByDefault)> templateImplicitReturnNull = const Template<
         Message Function(DartType _type, bool isNonNullableByDefault)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""A non-null value must be returned since the return type '#type' doesn't allow null.""",
     withArguments: _withArgumentsImplicitReturnNull);
 
@@ -1421,7 +1434,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeImplicitReturnNull,
-      message:
+      problemMessage:
           """A non-null value must be returned since the return type '${type}' doesn't allow null.""" +
               labeler.originMessages,
       arguments: {'type': _type});
@@ -1434,7 +1447,7 @@
     templateIncompatibleRedirecteeFunctionType = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The constructor function type '#type' isn't a subtype of '#type2'.""",
         withArguments: _withArgumentsIncompatibleRedirecteeFunctionType);
 
@@ -1457,7 +1470,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeIncompatibleRedirecteeFunctionType,
-      message:
+      problemMessage:
           """The constructor function type '${type}' isn't a subtype of '${type2}'.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -1465,16 +1478,20 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
+    Message Function(
+        DartType _type,
+        DartType _type2,
+        String name,
+        String name2,
+        bool
+            isNonNullableByDefault)> templateIncorrectTypeArgument = const Template<
         Message Function(DartType _type, DartType _type2, String name,
-            String name2, bool isNonNullableByDefault)>
-    templateIncorrectTypeArgument = const Template<
-            Message Function(DartType _type, DartType _type2, String name,
-                String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'.""",
-        tipTemplate:
-            r"""Try changing type arguments so that they conform to the bounds.""",
-        withArguments: _withArgumentsIncorrectTypeArgument);
+            String name2, bool isNonNullableByDefault)>(
+    problemMessageTemplate:
+        r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'.""",
+    correctionMessageTemplate:
+        r"""Try changing type arguments so that they conform to the bounds.""",
+    withArguments: _withArgumentsIncorrectTypeArgument);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<
@@ -1502,10 +1519,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeIncorrectTypeArgument,
-      message:
+      problemMessage:
           """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}'.""" +
               labeler.originMessages,
-      tip: """Try changing type arguments so that they conform to the bounds.""",
+      correctionMessage: """Try changing type arguments so that they conform to the bounds.""",
       arguments: {
         'type': _type,
         'type2': _type2,
@@ -1521,9 +1538,9 @@
     templateIncorrectTypeArgumentInReturnType = const Template<
             Message Function(DartType _type, DartType _type2, String name,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the return type.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try changing type arguments so that they conform to the bounds.""",
         withArguments: _withArgumentsIncorrectTypeArgumentInReturnType);
 
@@ -1550,10 +1567,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeIncorrectTypeArgumentInReturnType,
-      message:
+      problemMessage:
           """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}' in the return type.""" +
               labeler.originMessages,
-      tip: """Try changing type arguments so that they conform to the bounds.""",
+      correctionMessage: """Try changing type arguments so that they conform to the bounds.""",
       arguments: {
         'type': _type,
         'type2': _type2,
@@ -1581,9 +1598,9 @@
                 String name3,
                 String name4,
                 bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try changing type arguments so that they conform to the bounds.""",
         withArguments: _withArgumentsIncorrectTypeArgumentInSupertype);
 
@@ -1632,10 +1649,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeIncorrectTypeArgumentInSupertype,
-      message:
+      problemMessage:
           """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}' in the supertype '${name3}' of class '${name4}'.""" +
               labeler.originMessages,
-      tip:
+      correctionMessage:
           """Try changing type arguments so that they conform to the bounds.""",
       arguments: {
         'type': _type,
@@ -1666,9 +1683,9 @@
                 String name3,
                 String name4,
                 bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try specifying type arguments explicitly so that they conform to the bounds.""",
         withArguments: _withArgumentsIncorrectTypeArgumentInSupertypeInferred);
 
@@ -1717,10 +1734,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeIncorrectTypeArgumentInSupertypeInferred,
-      message:
+      problemMessage:
           """Inferred type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}' in the supertype '${name3}' of class '${name4}'.""" +
               labeler.originMessages,
-      tip:
+      correctionMessage:
           """Try specifying type arguments explicitly so that they conform to the bounds.""",
       arguments: {
         'type': _type,
@@ -1739,9 +1756,9 @@
     templateIncorrectTypeArgumentInferred = const Template<
             Message Function(DartType _type, DartType _type2, String name,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try specifying type arguments explicitly so that they conform to the bounds.""",
         withArguments: _withArgumentsIncorrectTypeArgumentInferred);
 
@@ -1771,10 +1788,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeIncorrectTypeArgumentInferred,
-      message:
+      problemMessage:
           """Inferred type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}'.""" +
               labeler.originMessages,
-      tip: """Try specifying type arguments explicitly so that they conform to the bounds.""",
+      correctionMessage: """Try specifying type arguments explicitly so that they conform to the bounds.""",
       arguments: {
         'type': _type,
         'type2': _type2,
@@ -1790,9 +1807,9 @@
     templateIncorrectTypeArgumentInstantiation = const Template<
             Message Function(DartType _type, DartType _type2, String name,
                 DartType _type3, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3'.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try changing type arguments so that they conform to the bounds.""",
         withArguments: _withArgumentsIncorrectTypeArgumentInstantiation);
 
@@ -1823,10 +1840,10 @@
   String type2 = type2Parts.join();
   String type3 = type3Parts.join();
   return new Message(codeIncorrectTypeArgumentInstantiation,
-      message:
+      problemMessage:
           """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${type3}'.""" +
               labeler.originMessages,
-      tip: """Try changing type arguments so that they conform to the bounds.""",
+      correctionMessage: """Try changing type arguments so that they conform to the bounds.""",
       arguments: {
         'type': _type,
         'type2': _type2,
@@ -1842,9 +1859,9 @@
     templateIncorrectTypeArgumentInstantiationInferred = const Template<
             Message Function(DartType _type, DartType _type2, String name,
                 DartType _type3, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3'.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try specifying type arguments explicitly so that they conform to the bounds.""",
         withArguments:
             _withArgumentsIncorrectTypeArgumentInstantiationInferred);
@@ -1876,10 +1893,10 @@
   String type2 = type2Parts.join();
   String type3 = type3Parts.join();
   return new Message(codeIncorrectTypeArgumentInstantiationInferred,
-      message:
+      problemMessage:
           """Inferred type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${type3}'.""" +
               labeler.originMessages,
-      tip: """Try specifying type arguments explicitly so that they conform to the bounds.""",
+      correctionMessage: """Try specifying type arguments explicitly so that they conform to the bounds.""",
       arguments: {
         'type': _type,
         'type2': _type2,
@@ -1895,9 +1912,9 @@
     templateIncorrectTypeArgumentQualified = const Template<
             Message Function(DartType _type, DartType _type2, String name,
                 DartType _type3, String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try changing type arguments so that they conform to the bounds.""",
         withArguments: _withArgumentsIncorrectTypeArgumentQualified);
 
@@ -1935,10 +1952,10 @@
   String type2 = type2Parts.join();
   String type3 = type3Parts.join();
   return new Message(codeIncorrectTypeArgumentQualified,
-      message:
+      problemMessage:
           """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${type3}.${name2}'.""" +
               labeler.originMessages,
-      tip: """Try changing type arguments so that they conform to the bounds.""",
+      correctionMessage: """Try changing type arguments so that they conform to the bounds.""",
       arguments: {
         'type': _type,
         'type2': _type2,
@@ -1955,9 +1972,9 @@
     templateIncorrectTypeArgumentQualifiedInferred = const Template<
             Message Function(DartType _type, DartType _type2, String name,
                 DartType _type3, String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try specifying type arguments explicitly so that they conform to the bounds.""",
         withArguments: _withArgumentsIncorrectTypeArgumentQualifiedInferred);
 
@@ -1991,10 +2008,10 @@
   String type2 = type2Parts.join();
   String type3 = type3Parts.join();
   return new Message(codeIncorrectTypeArgumentQualifiedInferred,
-      message:
+      problemMessage:
           """Inferred type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${type3}.${name2}'.""" +
               labeler.originMessages,
-      tip: """Try specifying type arguments explicitly so that they conform to the bounds.""",
+      correctionMessage: """Try specifying type arguments explicitly so that they conform to the bounds.""",
       arguments: {
         'type': _type,
         'type2': _type2,
@@ -2006,14 +2023,22 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
-        Message Function(String name, DartType _type, DartType _type2,
-            bool isNonNullableByDefault)>
+        Message Function(
+            String name,
+            DartType _type,
+            DartType _type2,
+            bool
+                isNonNullableByDefault)>
     templateInitializingFormalTypeMismatch = const Template<
-            Message Function(String name, DartType _type, DartType _type2,
-                bool isNonNullableByDefault)>(
-        messageTemplate:
+            Message Function(
+                String name,
+                DartType _type,
+                DartType _type2,
+                bool
+                    isNonNullableByDefault)>(
+        problemMessageTemplate:
             r"""The type of parameter '#name', '#type' is not a subtype of the corresponding field's type, '#type2'.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try changing the type of parameter '#name' to a subtype of '#type2'.""",
         withArguments: _withArgumentsInitializingFormalTypeMismatch);
 
@@ -2037,10 +2062,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInitializingFormalTypeMismatch,
-      message:
+      problemMessage:
           """The type of parameter '${name}', '${type}' is not a subtype of the corresponding field's type, '${type2}'.""" +
               labeler.originMessages,
-      tip: """Try changing the type of parameter '${name}' to a subtype of '${type2}'.""",
+      correctionMessage: """Try changing the type of parameter '${name}' to a subtype of '${type2}'.""",
       arguments: {'name': name, 'type': _type, 'type2': _type2});
 }
 
@@ -2048,9 +2073,9 @@
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateInstantiationNonGenericFunctionType = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The static type of the explicit instantiation operand must be a generic function type but is '#type'.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try changing the operand or remove the type arguments.""",
         withArguments: _withArgumentsInstantiationNonGenericFunctionType);
 
@@ -2068,10 +2093,10 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeInstantiationNonGenericFunctionType,
-      message:
+      problemMessage:
           """The static type of the explicit instantiation operand must be a generic function type but is '${type}'.""" +
               labeler.originMessages,
-      tip: """Try changing the operand or remove the type arguments.""",
+      correctionMessage: """Try changing the operand or remove the type arguments.""",
       arguments: {'type': _type});
 }
 
@@ -2082,7 +2107,7 @@
     templateInternalProblemUnsupportedNullability = const Template<
             Message Function(
                 String string, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Unsupported nullability value '#string' on type '#type'.""",
         withArguments: _withArgumentsInternalProblemUnsupportedNullability);
 
@@ -2104,7 +2129,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeInternalProblemUnsupportedNullability,
-      message:
+      problemMessage:
           """Unsupported nullability value '${string}' on type '${type}'.""" +
               labeler.originMessages,
       arguments: {'string': string, 'type': _type});
@@ -2117,7 +2142,7 @@
     templateInvalidAssignmentError = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""A value of type '#type' can't be assigned to a variable of type '#type2'.""",
         withArguments: _withArgumentsInvalidAssignmentError);
 
@@ -2140,7 +2165,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidAssignmentError,
-      message:
+      problemMessage:
           """A value of type '${type}' can't be assigned to a variable of type '${type2}'.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -2153,7 +2178,7 @@
     templateInvalidAssignmentErrorNullability = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""A value of type '#type' can't be assigned to a variable of type '#type2' because '#type' is nullable and '#type2' isn't.""",
         withArguments: _withArgumentsInvalidAssignmentErrorNullability);
 
@@ -2176,7 +2201,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidAssignmentErrorNullability,
-      message:
+      problemMessage:
           """A value of type '${type}' can't be assigned to a variable of type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -2186,7 +2211,7 @@
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateInvalidAssignmentErrorNullabilityNull = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The value 'null' can't be assigned to a variable of type '#type' because '#type' is not nullable.""",
         withArguments: _withArgumentsInvalidAssignmentErrorNullabilityNull);
 
@@ -2204,7 +2229,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeInvalidAssignmentErrorNullabilityNull,
-      message:
+      problemMessage:
           """The value 'null' can't be assigned to a variable of type '${type}' because '${type}' is not nullable.""" +
               labeler.originMessages,
       arguments: {'type': _type});
@@ -2217,7 +2242,7 @@
     templateInvalidAssignmentErrorNullabilityNullType = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""A value of type '#type' can't be assigned to a variable of type '#type2' because '#type2' is not nullable.""",
         withArguments: _withArgumentsInvalidAssignmentErrorNullabilityNullType);
 
@@ -2240,7 +2265,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidAssignmentErrorNullabilityNullType,
-      message:
+      problemMessage:
           """A value of type '${type}' can't be assigned to a variable of type '${type2}' because '${type2}' is not nullable.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -2253,7 +2278,7 @@
     templateInvalidAssignmentErrorPartNullability = const Template<
             Message Function(DartType _type, DartType _type2, DartType _type3,
                 DartType _type4, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""A value of type '#type' can't be assigned to a variable of type '#type2' because '#type3' is nullable and '#type4' isn't.""",
         withArguments: _withArgumentsInvalidAssignmentErrorPartNullability);
 
@@ -2284,7 +2309,7 @@
   String type3 = type3Parts.join();
   String type4 = type4Parts.join();
   return new Message(codeInvalidAssignmentErrorPartNullability,
-      message:
+      problemMessage:
           """A value of type '${type}' can't be assigned to a variable of type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
               labeler.originMessages,
       arguments: {
@@ -2302,11 +2327,11 @@
         DartType _type2,
         bool
             isNonNullableByDefault)> templateInvalidCastFunctionExpr = const Template<
-        Message Function(
-            DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-    messageTemplate:
+        Message Function(DartType _type, DartType _type2,
+            bool isNonNullableByDefault)>(
+    problemMessageTemplate:
         r"""The function expression type '#type' isn't of expected type '#type2'.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Change the type of the function expression or the context in which it is used.""",
     withArguments: _withArgumentsInvalidCastFunctionExpr);
 
@@ -2329,10 +2354,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidCastFunctionExpr,
-      message:
+      problemMessage:
           """The function expression type '${type}' isn't of expected type '${type2}'.""" +
               labeler.originMessages,
-      tip: """Change the type of the function expression or the context in which it is used.""",
+      correctionMessage: """Change the type of the function expression or the context in which it is used.""",
       arguments: {'type': _type, 'type2': _type2});
 }
 
@@ -2343,14 +2368,11 @@
         DartType _type2,
         bool
             isNonNullableByDefault)> templateInvalidCastLiteralList = const Template<
-        Message Function(
-            DartType _type,
-            DartType _type2,
-            bool
-                isNonNullableByDefault)>(
-    messageTemplate:
+        Message Function(DartType _type, DartType _type2,
+            bool isNonNullableByDefault)>(
+    problemMessageTemplate:
         r"""The list literal type '#type' isn't of expected type '#type2'.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Change the type of the list literal or the context in which it is used.""",
     withArguments: _withArgumentsInvalidCastLiteralList);
 
@@ -2373,10 +2395,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidCastLiteralList,
-      message:
+      problemMessage:
           """The list literal type '${type}' isn't of expected type '${type2}'.""" +
               labeler.originMessages,
-      tip: """Change the type of the list literal or the context in which it is used.""",
+      correctionMessage: """Change the type of the list literal or the context in which it is used.""",
       arguments: {'type': _type, 'type2': _type2});
 }
 
@@ -2387,14 +2409,11 @@
         DartType _type2,
         bool
             isNonNullableByDefault)> templateInvalidCastLiteralMap = const Template<
-        Message Function(
-            DartType _type,
-            DartType _type2,
-            bool
-                isNonNullableByDefault)>(
-    messageTemplate:
+        Message Function(DartType _type, DartType _type2,
+            bool isNonNullableByDefault)>(
+    problemMessageTemplate:
         r"""The map literal type '#type' isn't of expected type '#type2'.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Change the type of the map literal or the context in which it is used.""",
     withArguments: _withArgumentsInvalidCastLiteralMap);
 
@@ -2417,10 +2436,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidCastLiteralMap,
-      message:
+      problemMessage:
           """The map literal type '${type}' isn't of expected type '${type2}'.""" +
               labeler.originMessages,
-      tip: """Change the type of the map literal or the context in which it is used.""",
+      correctionMessage: """Change the type of the map literal or the context in which it is used.""",
       arguments: {'type': _type, 'type2': _type2});
 }
 
@@ -2431,14 +2450,11 @@
         DartType _type2,
         bool
             isNonNullableByDefault)> templateInvalidCastLiteralSet = const Template<
-        Message Function(
-            DartType _type,
-            DartType _type2,
-            bool
-                isNonNullableByDefault)>(
-    messageTemplate:
+        Message Function(DartType _type, DartType _type2,
+            bool isNonNullableByDefault)>(
+    problemMessageTemplate:
         r"""The set literal type '#type' isn't of expected type '#type2'.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Change the type of the set literal or the context in which it is used.""",
     withArguments: _withArgumentsInvalidCastLiteralSet);
 
@@ -2461,10 +2477,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidCastLiteralSet,
-      message:
+      problemMessage:
           """The set literal type '${type}' isn't of expected type '${type2}'.""" +
               labeler.originMessages,
-      tip: """Change the type of the set literal or the context in which it is used.""",
+      correctionMessage: """Change the type of the set literal or the context in which it is used.""",
       arguments: {'type': _type, 'type2': _type2});
 }
 
@@ -2475,14 +2491,11 @@
         DartType _type2,
         bool
             isNonNullableByDefault)> templateInvalidCastLocalFunction = const Template<
-        Message Function(
-            DartType _type,
-            DartType _type2,
-            bool
-                isNonNullableByDefault)>(
-    messageTemplate:
+        Message Function(DartType _type, DartType _type2,
+            bool isNonNullableByDefault)>(
+    problemMessageTemplate:
         r"""The local function has type '#type' that isn't of expected type '#type2'.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Change the type of the function or the context in which it is used.""",
     withArguments: _withArgumentsInvalidCastLocalFunction);
 
@@ -2505,10 +2518,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidCastLocalFunction,
-      message:
+      problemMessage:
           """The local function has type '${type}' that isn't of expected type '${type2}'.""" +
               labeler.originMessages,
-      tip: """Change the type of the function or the context in which it is used.""",
+      correctionMessage: """Change the type of the function or the context in which it is used.""",
       arguments: {'type': _type, 'type2': _type2});
 }
 
@@ -2519,14 +2532,11 @@
         DartType _type2,
         bool
             isNonNullableByDefault)> templateInvalidCastNewExpr = const Template<
-        Message Function(
-            DartType _type,
-            DartType _type2,
-            bool
-                isNonNullableByDefault)>(
-    messageTemplate:
+        Message Function(DartType _type, DartType _type2,
+            bool isNonNullableByDefault)>(
+    problemMessageTemplate:
         r"""The constructor returns type '#type' that isn't of expected type '#type2'.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Change the type of the object being constructed or the context in which it is used.""",
     withArguments: _withArgumentsInvalidCastNewExpr);
 
@@ -2549,10 +2559,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidCastNewExpr,
-      message:
+      problemMessage:
           """The constructor returns type '${type}' that isn't of expected type '${type2}'.""" +
               labeler.originMessages,
-      tip: """Change the type of the object being constructed or the context in which it is used.""",
+      correctionMessage: """Change the type of the object being constructed or the context in which it is used.""",
       arguments: {'type': _type, 'type2': _type2});
 }
 
@@ -2563,11 +2573,11 @@
         DartType _type2,
         bool
             isNonNullableByDefault)> templateInvalidCastStaticMethod = const Template<
-        Message Function(
-            DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-    messageTemplate:
+        Message Function(DartType _type, DartType _type2,
+            bool isNonNullableByDefault)>(
+    problemMessageTemplate:
         r"""The static method has type '#type' that isn't of expected type '#type2'.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Change the type of the method or the context in which it is used.""",
     withArguments: _withArgumentsInvalidCastStaticMethod);
 
@@ -2590,10 +2600,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidCastStaticMethod,
-      message:
+      problemMessage:
           """The static method has type '${type}' that isn't of expected type '${type2}'.""" +
               labeler.originMessages,
-      tip: """Change the type of the method or the context in which it is used.""",
+      correctionMessage: """Change the type of the method or the context in which it is used.""",
       arguments: {'type': _type, 'type2': _type2});
 }
 
@@ -2604,9 +2614,9 @@
     templateInvalidCastTopLevelFunction = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The top level function has type '#type' that isn't of expected type '#type2'.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Change the type of the function or the context in which it is used.""",
         withArguments: _withArgumentsInvalidCastTopLevelFunction);
 
@@ -2629,10 +2639,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidCastTopLevelFunction,
-      message:
+      problemMessage:
           """The top level function has type '${type}' that isn't of expected type '${type2}'.""" +
               labeler.originMessages,
-      tip: """Change the type of the function or the context in which it is used.""",
+      correctionMessage: """Change the type of the function or the context in which it is used.""",
       arguments: {'type': _type, 'type2': _type2});
 }
 
@@ -2643,7 +2653,7 @@
     templateInvalidGetterSetterType = const Template<
             Message Function(DartType _type, String name, DartType _type2,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' of the getter '#name' is not a subtype of the type '#type2' of the setter '#name2'.""",
         withArguments: _withArgumentsInvalidGetterSetterType);
 
@@ -2669,7 +2679,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidGetterSetterType,
-      message:
+      problemMessage:
           """The type '${type}' of the getter '${name}' is not a subtype of the type '${type2}' of the setter '${name2}'.""" +
               labeler.originMessages,
       arguments: {
@@ -2687,7 +2697,7 @@
     templateInvalidGetterSetterTypeBothInheritedField = const Template<
             Message Function(DartType _type, String name, DartType _type2,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' of the inherited field '#name' is not a subtype of the type '#type2' of the inherited setter '#name2'.""",
         withArguments: _withArgumentsInvalidGetterSetterTypeBothInheritedField);
 
@@ -2714,7 +2724,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidGetterSetterTypeBothInheritedField,
-      message:
+      problemMessage:
           """The type '${type}' of the inherited field '${name}' is not a subtype of the type '${type2}' of the inherited setter '${name2}'.""" +
               labeler.originMessages,
       arguments: {
@@ -2732,7 +2742,7 @@
     templateInvalidGetterSetterTypeBothInheritedFieldLegacy = const Template<
             Message Function(DartType _type, String name, DartType _type2,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' of the inherited field '#name' is not assignable to the type '#type2' of the inherited setter '#name2'.""",
         withArguments:
             _withArgumentsInvalidGetterSetterTypeBothInheritedFieldLegacy);
@@ -2764,7 +2774,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidGetterSetterTypeBothInheritedFieldLegacy,
-      message:
+      problemMessage:
           """The type '${type}' of the inherited field '${name}' is not assignable to the type '${type2}' of the inherited setter '${name2}'.""" +
               labeler.originMessages,
       arguments: {
@@ -2782,7 +2792,7 @@
     templateInvalidGetterSetterTypeBothInheritedGetter = const Template<
             Message Function(DartType _type, String name, DartType _type2,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' of the inherited getter '#name' is not a subtype of the type '#type2' of the inherited setter '#name2'.""",
         withArguments:
             _withArgumentsInvalidGetterSetterTypeBothInheritedGetter);
@@ -2810,7 +2820,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidGetterSetterTypeBothInheritedGetter,
-      message:
+      problemMessage:
           """The type '${type}' of the inherited getter '${name}' is not a subtype of the type '${type2}' of the inherited setter '${name2}'.""" +
               labeler.originMessages,
       arguments: {
@@ -2828,7 +2838,7 @@
     templateInvalidGetterSetterTypeBothInheritedGetterLegacy = const Template<
             Message Function(DartType _type, String name, DartType _type2,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' of the inherited getter '#name' is not assignable to the type '#type2' of the inherited setter '#name2'.""",
         withArguments:
             _withArgumentsInvalidGetterSetterTypeBothInheritedGetterLegacy);
@@ -2860,7 +2870,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidGetterSetterTypeBothInheritedGetterLegacy,
-      message:
+      problemMessage:
           """The type '${type}' of the inherited getter '${name}' is not assignable to the type '${type2}' of the inherited setter '${name2}'.""" +
               labeler.originMessages,
       arguments: {
@@ -2878,7 +2888,7 @@
     templateInvalidGetterSetterTypeFieldInherited = const Template<
             Message Function(DartType _type, String name, DartType _type2,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' of the inherited field '#name' is not a subtype of the type '#type2' of the setter '#name2'.""",
         withArguments: _withArgumentsInvalidGetterSetterTypeFieldInherited);
 
@@ -2905,7 +2915,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidGetterSetterTypeFieldInherited,
-      message:
+      problemMessage:
           """The type '${type}' of the inherited field '${name}' is not a subtype of the type '${type2}' of the setter '${name2}'.""" +
               labeler.originMessages,
       arguments: {
@@ -2923,7 +2933,7 @@
     templateInvalidGetterSetterTypeFieldInheritedLegacy = const Template<
             Message Function(DartType _type, String name, DartType _type2,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' of the inherited field '#name' is not assignable to the type '#type2' of the setter '#name2'.""",
         withArguments:
             _withArgumentsInvalidGetterSetterTypeFieldInheritedLegacy);
@@ -2955,7 +2965,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidGetterSetterTypeFieldInheritedLegacy,
-      message:
+      problemMessage:
           """The type '${type}' of the inherited field '${name}' is not assignable to the type '${type2}' of the setter '${name2}'.""" +
               labeler.originMessages,
       arguments: {
@@ -2973,7 +2983,7 @@
     templateInvalidGetterSetterTypeGetterInherited = const Template<
             Message Function(DartType _type, String name, DartType _type2,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' of the inherited getter '#name' is not a subtype of the type '#type2' of the setter '#name2'.""",
         withArguments: _withArgumentsInvalidGetterSetterTypeGetterInherited);
 
@@ -3000,7 +3010,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidGetterSetterTypeGetterInherited,
-      message:
+      problemMessage:
           """The type '${type}' of the inherited getter '${name}' is not a subtype of the type '${type2}' of the setter '${name2}'.""" +
               labeler.originMessages,
       arguments: {
@@ -3018,7 +3028,7 @@
     templateInvalidGetterSetterTypeGetterInheritedLegacy = const Template<
             Message Function(DartType _type, String name, DartType _type2,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' of the inherited getter '#name' is not assignable to the type '#type2' of the setter '#name2'.""",
         withArguments:
             _withArgumentsInvalidGetterSetterTypeGetterInheritedLegacy);
@@ -3050,7 +3060,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidGetterSetterTypeGetterInheritedLegacy,
-      message:
+      problemMessage:
           """The type '${type}' of the inherited getter '${name}' is not assignable to the type '${type2}' of the setter '${name2}'.""" +
               labeler.originMessages,
       arguments: {
@@ -3068,7 +3078,7 @@
     templateInvalidGetterSetterTypeLegacy = const Template<
             Message Function(DartType _type, String name, DartType _type2,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' of the getter '#name' is not assignable to the type '#type2' of the setter '#name2'.""",
         withArguments: _withArgumentsInvalidGetterSetterTypeLegacy);
 
@@ -3095,7 +3105,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidGetterSetterTypeLegacy,
-      message:
+      problemMessage:
           """The type '${type}' of the getter '${name}' is not assignable to the type '${type2}' of the setter '${name2}'.""" +
               labeler.originMessages,
       arguments: {
@@ -3113,7 +3123,7 @@
     templateInvalidGetterSetterTypeSetterInheritedField = const Template<
             Message Function(DartType _type, String name, DartType _type2,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' of the field '#name' is not a subtype of the type '#type2' of the inherited setter '#name2'.""",
         withArguments:
             _withArgumentsInvalidGetterSetterTypeSetterInheritedField);
@@ -3145,7 +3155,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidGetterSetterTypeSetterInheritedField,
-      message:
+      problemMessage:
           """The type '${type}' of the field '${name}' is not a subtype of the type '${type2}' of the inherited setter '${name2}'.""" +
               labeler.originMessages,
       arguments: {
@@ -3163,7 +3173,7 @@
     templateInvalidGetterSetterTypeSetterInheritedFieldLegacy = const Template<
             Message Function(DartType _type, String name, DartType _type2,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' of the field '#name' is not assignable to the type '#type2' of the inherited setter '#name2'.""",
         withArguments:
             _withArgumentsInvalidGetterSetterTypeSetterInheritedFieldLegacy);
@@ -3195,7 +3205,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidGetterSetterTypeSetterInheritedFieldLegacy,
-      message:
+      problemMessage:
           """The type '${type}' of the field '${name}' is not assignable to the type '${type2}' of the inherited setter '${name2}'.""" +
               labeler.originMessages,
       arguments: {
@@ -3213,7 +3223,7 @@
     templateInvalidGetterSetterTypeSetterInheritedGetter = const Template<
             Message Function(DartType _type, String name, DartType _type2,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' of the getter '#name' is not a subtype of the type '#type2' of the inherited setter '#name2'.""",
         withArguments:
             _withArgumentsInvalidGetterSetterTypeSetterInheritedGetter);
@@ -3245,7 +3255,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidGetterSetterTypeSetterInheritedGetter,
-      message:
+      problemMessage:
           """The type '${type}' of the getter '${name}' is not a subtype of the type '${type2}' of the inherited setter '${name2}'.""" +
               labeler.originMessages,
       arguments: {
@@ -3263,7 +3273,7 @@
     templateInvalidGetterSetterTypeSetterInheritedGetterLegacy = const Template<
             Message Function(DartType _type, String name, DartType _type2,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' of the getter '#name' is not assignable to the type '#type2' of the inherited setter '#name2'.""",
         withArguments:
             _withArgumentsInvalidGetterSetterTypeSetterInheritedGetterLegacy);
@@ -3295,7 +3305,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidGetterSetterTypeSetterInheritedGetterLegacy,
-      message:
+      problemMessage:
           """The type '${type}' of the getter '${name}' is not assignable to the type '${type2}' of the inherited setter '${name2}'.""" +
               labeler.originMessages,
       arguments: {
@@ -3315,7 +3325,7 @@
             isNonNullableByDefault)> templateInvalidReturn = const Template<
         Message Function(
             DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""A value of type '#type' can't be returned from a function with return type '#type2'.""",
     withArguments: _withArgumentsInvalidReturn);
 
@@ -3338,7 +3348,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidReturn,
-      message:
+      problemMessage:
           """A value of type '${type}' can't be returned from a function with return type '${type2}'.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -3353,7 +3363,7 @@
             isNonNullableByDefault)> templateInvalidReturnAsync = const Template<
         Message Function(
             DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""A value of type '#type' can't be returned from an async function with return type '#type2'.""",
     withArguments: _withArgumentsInvalidReturnAsync);
 
@@ -3376,7 +3386,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidReturnAsync,
-      message:
+      problemMessage:
           """A value of type '${type}' can't be returned from an async function with return type '${type2}'.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -3389,7 +3399,7 @@
     templateInvalidReturnAsyncNullability = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""A value of type '#type' can't be returned from an async function with return type '#type2' because '#type' is nullable and '#type2' isn't.""",
         withArguments: _withArgumentsInvalidReturnAsyncNullability);
 
@@ -3412,7 +3422,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidReturnAsyncNullability,
-      message:
+      problemMessage:
           """A value of type '${type}' can't be returned from an async function with return type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -3422,7 +3432,7 @@
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateInvalidReturnAsyncNullabilityNull = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The value 'null' can't be returned from an async function with return type '#type' because '#type' is not nullable.""",
         withArguments: _withArgumentsInvalidReturnAsyncNullabilityNull);
 
@@ -3440,7 +3450,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeInvalidReturnAsyncNullabilityNull,
-      message:
+      problemMessage:
           """The value 'null' can't be returned from an async function with return type '${type}' because '${type}' is not nullable.""" +
               labeler.originMessages,
       arguments: {'type': _type});
@@ -3453,7 +3463,7 @@
     templateInvalidReturnAsyncNullabilityNullType = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""A value of type '#type' can't be returned from an async function with return type '#type2' because '#type2' is not nullable.""",
         withArguments: _withArgumentsInvalidReturnAsyncNullabilityNullType);
 
@@ -3476,7 +3486,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidReturnAsyncNullabilityNullType,
-      message:
+      problemMessage:
           """A value of type '${type}' can't be returned from an async function with return type '${type2}' because '${type2}' is not nullable.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -3489,7 +3499,7 @@
     templateInvalidReturnAsyncPartNullability = const Template<
             Message Function(DartType _type, DartType _type2, DartType _type3,
                 DartType _type4, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""A value of type '#type' can't be returned from an async function with return type '#type2' because '#type3' is nullable and '#type4' isn't.""",
         withArguments: _withArgumentsInvalidReturnAsyncPartNullability);
 
@@ -3520,7 +3530,7 @@
   String type3 = type3Parts.join();
   String type4 = type4Parts.join();
   return new Message(codeInvalidReturnAsyncPartNullability,
-      message:
+      problemMessage:
           """A value of type '${type}' can't be returned from an async function with return type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
               labeler.originMessages,
       arguments: {
@@ -3538,7 +3548,7 @@
     templateInvalidReturnNullability = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""A value of type '#type' can't be returned from a function with return type '#type2' because '#type' is nullable and '#type2' isn't.""",
         withArguments: _withArgumentsInvalidReturnNullability);
 
@@ -3561,7 +3571,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidReturnNullability,
-      message:
+      problemMessage:
           """A value of type '${type}' can't be returned from a function with return type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -3571,7 +3581,7 @@
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateInvalidReturnNullabilityNull = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The value 'null' can't be returned from a function with return type '#type' because '#type' is not nullable.""",
         withArguments: _withArgumentsInvalidReturnNullabilityNull);
 
@@ -3589,7 +3599,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeInvalidReturnNullabilityNull,
-      message:
+      problemMessage:
           """The value 'null' can't be returned from a function with return type '${type}' because '${type}' is not nullable.""" +
               labeler.originMessages,
       arguments: {'type': _type});
@@ -3602,7 +3612,7 @@
     templateInvalidReturnNullabilityNullType = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""A value of type '#type' can't be returned from a function with return type '#type2' because '#type2' is not nullable.""",
         withArguments: _withArgumentsInvalidReturnNullabilityNullType);
 
@@ -3625,7 +3635,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeInvalidReturnNullabilityNullType,
-      message:
+      problemMessage:
           """A value of type '${type}' can't be returned from a function with return type '${type2}' because '${type2}' is not nullable.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -3638,7 +3648,7 @@
     templateInvalidReturnPartNullability = const Template<
             Message Function(DartType _type, DartType _type2, DartType _type3,
                 DartType _type4, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""A value of type '#type' can't be returned from a function with return type '#type2' because '#type3' is nullable and '#type4' isn't.""",
         withArguments: _withArgumentsInvalidReturnPartNullability);
 
@@ -3669,7 +3679,7 @@
   String type3 = type3Parts.join();
   String type4 = type4Parts.join();
   return new Message(codeInvalidReturnPartNullability,
-      message:
+      problemMessage:
           """A value of type '${type}' can't be returned from a function with return type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
               labeler.originMessages,
       arguments: {
@@ -3687,7 +3697,7 @@
     templateMainWrongParameterType = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' of the first parameter of the 'main' method is not a supertype of '#type2'.""",
         withArguments: _withArgumentsMainWrongParameterType);
 
@@ -3710,7 +3720,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeMainWrongParameterType,
-      message:
+      problemMessage:
           """The type '${type}' of the first parameter of the 'main' method is not a supertype of '${type2}'.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -3723,7 +3733,7 @@
     templateMainWrongParameterTypeExported = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#type' of the first parameter of the exported 'main' method is not a supertype of '#type2'.""",
         withArguments: _withArgumentsMainWrongParameterTypeExported);
 
@@ -3746,7 +3756,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeMainWrongParameterTypeExported,
-      message:
+      problemMessage:
           """The type '${type}' of the first parameter of the exported 'main' method is not a supertype of '${type2}'.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -3759,7 +3769,7 @@
     templateMixinApplicationIncompatibleSupertype = const Template<
             Message Function(DartType _type, DartType _type2, DartType _type3,
                 bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""'#type' doesn't implement '#type2' so it can't be used with '#type3'.""",
         withArguments: _withArgumentsMixinApplicationIncompatibleSupertype);
 
@@ -3784,7 +3794,7 @@
   String type2 = type2Parts.join();
   String type3 = type3Parts.join();
   return new Message(codeMixinApplicationIncompatibleSupertype,
-      message:
+      problemMessage:
           """'${type}' doesn't implement '${type2}' so it can't be used with '${type3}'.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2, 'type3': _type3});
@@ -3794,11 +3804,10 @@
 const Template<
         Message Function(String name, String name2, DartType _type,
             bool isNonNullableByDefault)>
-    templateMixinInferenceNoMatchingClass =
-    const Template<
+    templateMixinInferenceNoMatchingClass = const Template<
             Message Function(String name, String name2, DartType _type,
                 bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Type parameters couldn't be inferred for the mixin '#name' because '#name2' does not implement the mixin's supertype constraint '#type'.""",
         withArguments: _withArgumentsMixinInferenceNoMatchingClass);
 
@@ -3822,7 +3831,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeMixinInferenceNoMatchingClass,
-      message:
+      problemMessage:
           """Type parameters couldn't be inferred for the mixin '${name}' because '${name2}' does not implement the mixin's supertype constraint '${type}'.""" +
               labeler.originMessages,
       arguments: {'name': name, 'name2': name2, 'type': _type});
@@ -3832,7 +3841,8 @@
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateNonNullAwareSpreadIsNull = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate: r"""Can't spread a value with static type '#type'.""",
+        problemMessageTemplate:
+            r"""Can't spread a value with static type '#type'.""",
         withArguments: _withArgumentsNonNullAwareSpreadIsNull);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3849,7 +3859,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeNonNullAwareSpreadIsNull,
-      message: """Can't spread a value with static type '${type}'.""" +
+      problemMessage: """Can't spread a value with static type '${type}'.""" +
           labeler.originMessages,
       arguments: {'type': _type});
 }
@@ -3861,7 +3871,7 @@
     templateNonNullableInNullAware = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Operand of null-aware operation '#name' has type '#type' which excludes null.""",
         withArguments: _withArgumentsNonNullableInNullAware);
 
@@ -3884,7 +3894,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeNonNullableInNullAware,
-      message:
+      problemMessage:
           """Operand of null-aware operation '${name}' has type '${type}' which excludes null.""" +
               labeler.originMessages,
       arguments: {'name': name, 'type': _type});
@@ -3894,9 +3904,9 @@
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateNullableExpressionCallError = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't use an expression of type '#type' as a function because it's potentially null.""",
-        tipTemplate: r"""Try calling using ?.call instead.""",
+        correctionMessageTemplate: r"""Try calling using ?.call instead.""",
         withArguments: _withArgumentsNullableExpressionCallError);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3913,10 +3923,10 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeNullableExpressionCallError,
-      message:
+      problemMessage:
           """Can't use an expression of type '${type}' as a function because it's potentially null.""" +
               labeler.originMessages,
-      tip: """Try calling using ?.call instead.""",
+      correctionMessage: """Try calling using ?.call instead.""",
       arguments: {'type': _type});
 }
 
@@ -3927,9 +3937,9 @@
     templateNullableMethodCallError = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Method '#name' cannot be called on '#type' because it is potentially null.""",
-        tipTemplate: r"""Try calling using ?. instead.""",
+        correctionMessageTemplate: r"""Try calling using ?. instead.""",
         withArguments: _withArgumentsNullableMethodCallError);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3949,10 +3959,10 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeNullableMethodCallError,
-      message:
+      problemMessage:
           """Method '${name}' cannot be called on '${type}' because it is potentially null.""" +
               labeler.originMessages,
-      tip: """Try calling using ?. instead.""",
+      correctionMessage: """Try calling using ?. instead.""",
       arguments: {'name': name, 'type': _type});
 }
 
@@ -3963,7 +3973,7 @@
     templateNullableOperatorCallError = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Operator '#name' cannot be called on '#type' because it is potentially null.""",
         withArguments: _withArgumentsNullableOperatorCallError);
 
@@ -3986,7 +3996,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeNullableOperatorCallError,
-      message:
+      problemMessage:
           """Operator '${name}' cannot be called on '${type}' because it is potentially null.""" +
               labeler.originMessages,
       arguments: {'name': name, 'type': _type});
@@ -3999,9 +4009,9 @@
     templateNullablePropertyAccessError = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Property '#name' cannot be accessed on '#type' because it is potentially null.""",
-        tipTemplate: r"""Try accessing using ?. instead.""",
+        correctionMessageTemplate: r"""Try accessing using ?. instead.""",
         withArguments: _withArgumentsNullablePropertyAccessError);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4023,10 +4033,10 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeNullablePropertyAccessError,
-      message:
+      problemMessage:
           """Property '${name}' cannot be accessed on '${type}' because it is potentially null.""" +
               labeler.originMessages,
-      tip: """Try accessing using ?. instead.""",
+      correctionMessage: """Try accessing using ?. instead.""",
       arguments: {'name': name, 'type': _type});
 }
 
@@ -4037,9 +4047,9 @@
     templateOptionalNonNullableWithoutInitializerError = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The parameter '#name' can't have a value of 'null' because of its type '#type', but the implicit default value is 'null'.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try adding either an explicit non-'null' default value or the 'required' modifier.""",
         withArguments:
             _withArgumentsOptionalNonNullableWithoutInitializerError);
@@ -4063,10 +4073,10 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeOptionalNonNullableWithoutInitializerError,
-      message:
+      problemMessage:
           """The parameter '${name}' can't have a value of 'null' because of its type '${type}', but the implicit default value is 'null'.""" +
               labeler.originMessages,
-      tip: """Try adding either an explicit non-'null' default value or the 'required' modifier.""",
+      correctionMessage: """Try adding either an explicit non-'null' default value or the 'required' modifier.""",
       arguments: {'name': name, 'type': _type});
 }
 
@@ -4077,9 +4087,9 @@
     templateOverrideTypeMismatchParameter = const Template<
             Message Function(String name, String name2, DartType _type,
                 DartType _type2, String name3, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The parameter '#name' of the method '#name2' has type '#type', which does not match the corresponding type, '#type2', in the overridden method, '#name3'.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Change to a supertype of '#type2', or, for a covariant parameter, a subtype.""",
         withArguments: _withArgumentsOverrideTypeMismatchParameter);
 
@@ -4117,10 +4127,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeOverrideTypeMismatchParameter,
-      message:
+      problemMessage:
           """The parameter '${name}' of the method '${name2}' has type '${type}', which does not match the corresponding type, '${type2}', in the overridden method, '${name3}'.""" +
               labeler.originMessages,
-      tip: """Change to a supertype of '${type2}', or, for a covariant parameter, a subtype.""",
+      correctionMessage: """Change to a supertype of '${type2}', or, for a covariant parameter, a subtype.""",
       arguments: {
         'name': name,
         'name2': name2,
@@ -4137,9 +4147,9 @@
     templateOverrideTypeMismatchReturnType = const Template<
             Message Function(String name, DartType _type, DartType _type2,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The return type of the method '#name' is '#type', which does not match the return type, '#type2', of the overridden method, '#name2'.""",
-        tipTemplate: r"""Change to a subtype of '#type2'.""",
+        correctionMessageTemplate: r"""Change to a subtype of '#type2'.""",
         withArguments: _withArgumentsOverrideTypeMismatchReturnType);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4172,10 +4182,10 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeOverrideTypeMismatchReturnType,
-      message:
+      problemMessage:
           """The return type of the method '${name}' is '${type}', which does not match the return type, '${type2}', of the overridden method, '${name2}'.""" +
               labeler.originMessages,
-      tip: """Change to a subtype of '${type2}'.""",
+      correctionMessage: """Change to a subtype of '${type2}'.""",
       arguments: {
         'name': name,
         'type': _type,
@@ -4191,7 +4201,7 @@
     templateOverrideTypeMismatchSetter = const Template<
             Message Function(String name, DartType _type, DartType _type2,
                 String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The field '#name' has type '#type', which does not match the corresponding type, '#type2', in the overridden setter, '#name2'.""",
         withArguments: _withArgumentsOverrideTypeMismatchSetter);
 
@@ -4221,7 +4231,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeOverrideTypeMismatchSetter,
-      message:
+      problemMessage:
           """The field '${name}' has type '${type}', which does not match the corresponding type, '${type2}', in the overridden setter, '${name2}'.""" +
               labeler.originMessages,
       arguments: {
@@ -4239,7 +4249,7 @@
     templateOverrideTypeVariablesBoundMismatch = const Template<
             Message Function(DartType _type, String name, String name2,
                 DartType _type2, String name3, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Declared bound '#type' of type variable '#name' of '#name2' doesn't match the bound '#type2' on overridden method '#name3'.""",
         withArguments: _withArgumentsOverrideTypeVariablesBoundMismatch);
 
@@ -4273,7 +4283,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeOverrideTypeVariablesBoundMismatch,
-      message:
+      problemMessage:
           """Declared bound '${type}' of type variable '${name}' of '${name2}' doesn't match the bound '${type2}' on overridden method '${name3}'.""" +
               labeler.originMessages,
       arguments: {
@@ -4292,8 +4302,10 @@
     templateRedirectingFactoryIncompatibleTypeArgument = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate: r"""The type '#type' doesn't extend '#type2'.""",
-        tipTemplate: r"""Try using a different type as argument.""",
+        problemMessageTemplate:
+            r"""The type '#type' doesn't extend '#type2'.""",
+        correctionMessageTemplate:
+            r"""Try using a different type as argument.""",
         withArguments:
             _withArgumentsRedirectingFactoryIncompatibleTypeArgument);
 
@@ -4316,9 +4328,9 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeRedirectingFactoryIncompatibleTypeArgument,
-      message: """The type '${type}' doesn't extend '${type2}'.""" +
+      problemMessage: """The type '${type}' doesn't extend '${type2}'.""" +
           labeler.originMessages,
-      tip: """Try using a different type as argument.""",
+      correctionMessage: """Try using a different type as argument.""",
       arguments: {'type': _type, 'type2': _type2});
 }
 
@@ -4329,7 +4341,7 @@
     templateSpreadElementTypeMismatch = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't assign spread elements of type '#type' to collection elements of type '#type2'.""",
         withArguments: _withArgumentsSpreadElementTypeMismatch);
 
@@ -4352,7 +4364,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeSpreadElementTypeMismatch,
-      message:
+      problemMessage:
           """Can't assign spread elements of type '${type}' to collection elements of type '${type2}'.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -4365,7 +4377,7 @@
     templateSpreadElementTypeMismatchNullability = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't assign spread elements of type '#type' to collection elements of type '#type2' because '#type' is nullable and '#type2' isn't.""",
         withArguments: _withArgumentsSpreadElementTypeMismatchNullability);
 
@@ -4388,7 +4400,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeSpreadElementTypeMismatchNullability,
-      message:
+      problemMessage:
           """Can't assign spread elements of type '${type}' to collection elements of type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -4401,7 +4413,7 @@
     templateSpreadElementTypeMismatchPartNullability = const Template<
             Message Function(DartType _type, DartType _type2, DartType _type3,
                 DartType _type4, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't assign spread elements of type '#type' to collection elements of type '#type2' because '#type3' is nullable and '#type4' isn't.""",
         withArguments: _withArgumentsSpreadElementTypeMismatchPartNullability);
 
@@ -4432,7 +4444,7 @@
   String type3 = type3Parts.join();
   String type4 = type4Parts.join();
   return new Message(codeSpreadElementTypeMismatchPartNullability,
-      message:
+      problemMessage:
           """Can't assign spread elements of type '${type}' to collection elements of type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
               labeler.originMessages,
       arguments: {
@@ -4450,7 +4462,7 @@
     templateSpreadMapEntryElementKeyTypeMismatch = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't assign spread entry keys of type '#type' to map entry keys of type '#type2'.""",
         withArguments: _withArgumentsSpreadMapEntryElementKeyTypeMismatch);
 
@@ -4473,7 +4485,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeSpreadMapEntryElementKeyTypeMismatch,
-      message:
+      problemMessage:
           """Can't assign spread entry keys of type '${type}' to map entry keys of type '${type2}'.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -4486,7 +4498,7 @@
     templateSpreadMapEntryElementKeyTypeMismatchNullability = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't assign spread entry keys of type '#type' to map entry keys of type '#type2' because '#type' is nullable and '#type2' isn't.""",
         withArguments:
             _withArgumentsSpreadMapEntryElementKeyTypeMismatchNullability);
@@ -4510,7 +4522,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeSpreadMapEntryElementKeyTypeMismatchNullability,
-      message:
+      problemMessage:
           """Can't assign spread entry keys of type '${type}' to map entry keys of type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -4524,7 +4536,7 @@
     const Template<
             Message Function(DartType _type, DartType _type2, DartType _type3,
                 DartType _type4, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't assign spread entry keys of type '#type' to map entry keys of type '#type2' because '#type3' is nullable and '#type4' isn't.""",
         withArguments:
             _withArgumentsSpreadMapEntryElementKeyTypeMismatchPartNullability);
@@ -4556,7 +4568,7 @@
   String type3 = type3Parts.join();
   String type4 = type4Parts.join();
   return new Message(codeSpreadMapEntryElementKeyTypeMismatchPartNullability,
-      message:
+      problemMessage:
           """Can't assign spread entry keys of type '${type}' to map entry keys of type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
               labeler.originMessages,
       arguments: {
@@ -4574,7 +4586,7 @@
     templateSpreadMapEntryElementValueTypeMismatch = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't assign spread entry values of type '#type' to map entry values of type '#type2'.""",
         withArguments: _withArgumentsSpreadMapEntryElementValueTypeMismatch);
 
@@ -4597,7 +4609,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeSpreadMapEntryElementValueTypeMismatch,
-      message:
+      problemMessage:
           """Can't assign spread entry values of type '${type}' to map entry values of type '${type2}'.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -4610,7 +4622,7 @@
     templateSpreadMapEntryElementValueTypeMismatchNullability = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't assign spread entry values of type '#type' to map entry values of type '#type2' because '#type' is nullable and '#type2' isn't.""",
         withArguments:
             _withArgumentsSpreadMapEntryElementValueTypeMismatchNullability);
@@ -4634,7 +4646,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeSpreadMapEntryElementValueTypeMismatchNullability,
-      message:
+      problemMessage:
           """Can't assign spread entry values of type '${type}' to map entry values of type '${type2}' because '${type}' is nullable and '${type2}' isn't.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -4648,7 +4660,7 @@
     const Template<
             Message Function(DartType _type, DartType _type2, DartType _type3,
                 DartType _type4, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't assign spread entry values of type '#type' to map entry values of type '#type2' because '#type3' is nullable and '#type4' isn't.""",
         withArguments:
             _withArgumentsSpreadMapEntryElementValueTypeMismatchPartNullability);
@@ -4680,7 +4692,7 @@
   String type3 = type3Parts.join();
   String type4 = type4Parts.join();
   return new Message(codeSpreadMapEntryElementValueTypeMismatchPartNullability,
-      message:
+      problemMessage:
           """Can't assign spread entry values of type '${type}' to map entry values of type '${type2}' because '${type3}' is nullable and '${type4}' isn't.""" +
               labeler.originMessages,
       arguments: {
@@ -4695,7 +4707,7 @@
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateSpreadMapEntryTypeMismatch = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Unexpected type '#type' of a map spread entry.  Expected 'dynamic' or a Map.""",
         withArguments: _withArgumentsSpreadMapEntryTypeMismatch);
 
@@ -4713,7 +4725,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeSpreadMapEntryTypeMismatch,
-      message:
+      problemMessage:
           """Unexpected type '${type}' of a map spread entry.  Expected 'dynamic' or a Map.""" +
               labeler.originMessages,
       arguments: {'type': _type});
@@ -4726,7 +4738,7 @@
         bool
             isNonNullableByDefault)> templateSpreadTypeMismatch = const Template<
         Message Function(DartType _type, bool isNonNullableByDefault)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""Unexpected type '#type' of a spread.  Expected 'dynamic' or an Iterable.""",
     withArguments: _withArgumentsSpreadTypeMismatch);
 
@@ -4744,7 +4756,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeSpreadTypeMismatch,
-      message:
+      problemMessage:
           """Unexpected type '${type}' of a spread.  Expected 'dynamic' or an Iterable.""" +
               labeler.originMessages,
       arguments: {'type': _type});
@@ -4759,7 +4771,7 @@
             isNonNullableByDefault)> templateSuperBoundedHint = const Template<
         Message Function(
             DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""If you want '#type' to be a super-bounded type, note that the inverted type '#type2' must then satisfy its bounds, which it does not.""",
     withArguments: _withArgumentsSuperBoundedHint);
 
@@ -4782,7 +4794,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeSuperBoundedHint,
-      message:
+      problemMessage:
           """If you want '${type}' to be a super-bounded type, note that the inverted type '${type2}' must then satisfy its bounds, which it does not.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -4795,7 +4807,7 @@
     templateSupertypeIsIllegalAliased = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#name' which is an alias of '#type' can't be used as supertype.""",
         withArguments: _withArgumentsSupertypeIsIllegalAliased);
 
@@ -4818,7 +4830,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeSupertypeIsIllegalAliased,
-      message:
+      problemMessage:
           """The type '${name}' which is an alias of '${type}' can't be used as supertype.""" +
               labeler.originMessages,
       arguments: {'name': name, 'type': _type});
@@ -4831,7 +4843,7 @@
     templateSupertypeIsNullableAliased = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The type '#name' which is an alias of '#type' can't be used as supertype because it is nullable.""",
         withArguments: _withArgumentsSupertypeIsNullableAliased);
 
@@ -4854,7 +4866,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeSupertypeIsNullableAliased,
-      message:
+      problemMessage:
           """The type '${name}' which is an alias of '${type}' can't be used as supertype because it is nullable.""" +
               labeler.originMessages,
       arguments: {'name': name, 'type': _type});
@@ -4867,7 +4879,7 @@
     templateSwitchExpressionNotAssignable = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Type '#type' of the switch expression isn't assignable to the type '#type2' of this case expression.""",
         withArguments: _withArgumentsSwitchExpressionNotAssignable);
 
@@ -4890,7 +4902,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeSwitchExpressionNotAssignable,
-      message:
+      problemMessage:
           """Type '${type}' of the switch expression isn't assignable to the type '${type2}' of this case expression.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -4903,7 +4915,7 @@
     templateSwitchExpressionNotSubtype = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Type '#type' of the case expression is not a subtype of type '#type2' of this switch expression.""",
         withArguments: _withArgumentsSwitchExpressionNotSubtype);
 
@@ -4926,7 +4938,7 @@
   String type = typeParts.join();
   String type2 = type2Parts.join();
   return new Message(codeSwitchExpressionNotSubtype,
-      message:
+      problemMessage:
           """Type '${type}' of the case expression is not a subtype of type '${type2}' of this switch expression.""" +
               labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
@@ -4936,7 +4948,7 @@
 const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
     templateThrowingNotAssignableToObjectError = const Template<
             Message Function(DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""Can't throw a value of '#type' since it is neither dynamic nor non-nullable.""",
         withArguments: _withArgumentsThrowingNotAssignableToObjectError);
 
@@ -4954,7 +4966,7 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeThrowingNotAssignableToObjectError,
-      message:
+      problemMessage:
           """Can't throw a value of '${type}' since it is neither dynamic nor non-nullable.""" +
               labeler.originMessages,
       arguments: {'type': _type});
@@ -4967,9 +4979,9 @@
     templateUndefinedExtensionGetter = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The getter '#name' isn't defined for the extension '#type'.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try correcting the name to the name of an existing getter, or defining a getter or field named '#name'.""",
         withArguments: _withArgumentsUndefinedExtensionGetter);
 
@@ -4990,10 +5002,10 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeUndefinedExtensionGetter,
-      message:
+      problemMessage:
           """The getter '${name}' isn't defined for the extension '${type}'.""" +
               labeler.originMessages,
-      tip: """Try correcting the name to the name of an existing getter, or defining a getter or field named '${name}'.""",
+      correctionMessage: """Try correcting the name to the name of an existing getter, or defining a getter or field named '${name}'.""",
       arguments: {'name': name, 'type': _type});
 }
 
@@ -5004,9 +5016,9 @@
     templateUndefinedExtensionMethod = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The method '#name' isn't defined for the extension '#type'.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try correcting the name to the name of an existing method, or defining a method name '#name'.""",
         withArguments: _withArgumentsUndefinedExtensionMethod);
 
@@ -5027,10 +5039,10 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeUndefinedExtensionMethod,
-      message:
+      problemMessage:
           """The method '${name}' isn't defined for the extension '${type}'.""" +
               labeler.originMessages,
-      tip: """Try correcting the name to the name of an existing method, or defining a method name '${name}'.""",
+      correctionMessage: """Try correcting the name to the name of an existing method, or defining a method name '${name}'.""",
       arguments: {'name': name, 'type': _type});
 }
 
@@ -5041,9 +5053,9 @@
     templateUndefinedExtensionOperator = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The operator '#name' isn't defined for the extension '#type'.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try correcting the operator to an existing operator, or defining a '#name' operator.""",
         withArguments: _withArgumentsUndefinedExtensionOperator);
 
@@ -5066,10 +5078,10 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeUndefinedExtensionOperator,
-      message:
+      problemMessage:
           """The operator '${name}' isn't defined for the extension '${type}'.""" +
               labeler.originMessages,
-      tip: """Try correcting the operator to an existing operator, or defining a '${name}' operator.""",
+      correctionMessage: """Try correcting the operator to an existing operator, or defining a '${name}' operator.""",
       arguments: {'name': name, 'type': _type});
 }
 
@@ -5080,9 +5092,9 @@
     templateUndefinedExtensionSetter = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
+        problemMessageTemplate:
             r"""The setter '#name' isn't defined for the extension '#type'.""",
-        tipTemplate:
+        correctionMessageTemplate:
             r"""Try correcting the name to the name of an existing setter, or defining a setter or field named '#name'.""",
         withArguments: _withArgumentsUndefinedExtensionSetter);
 
@@ -5103,10 +5115,10 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeUndefinedExtensionSetter,
-      message:
+      problemMessage:
           """The setter '${name}' isn't defined for the extension '${type}'.""" +
               labeler.originMessages,
-      tip: """Try correcting the name to the name of an existing setter, or defining a setter or field named '${name}'.""",
+      correctionMessage: """Try correcting the name to the name of an existing setter, or defining a setter or field named '${name}'.""",
       arguments: {'name': name, 'type': _type});
 }
 
@@ -5119,9 +5131,9 @@
             isNonNullableByDefault)> templateUndefinedGetter = const Template<
         Message Function(
             String name, DartType _type, bool isNonNullableByDefault)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The getter '#name' isn't defined for the class '#type'.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try correcting the name to the name of an existing getter, or defining a getter or field named '#name'.""",
     withArguments: _withArgumentsUndefinedGetter);
 
@@ -5144,10 +5156,10 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeUndefinedGetter,
-      message:
+      problemMessage:
           """The getter '${name}' isn't defined for the class '${type}'.""" +
               labeler.originMessages,
-      tip:
+      correctionMessage:
           """Try correcting the name to the name of an existing getter, or defining a getter or field named '${name}'.""",
       arguments: {'name': name, 'type': _type});
 }
@@ -5161,9 +5173,9 @@
             isNonNullableByDefault)> templateUndefinedMethod = const Template<
         Message Function(
             String name, DartType _type, bool isNonNullableByDefault)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The method '#name' isn't defined for the class '#type'.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try correcting the name to the name of an existing method, or defining a method named '#name'.""",
     withArguments: _withArgumentsUndefinedMethod);
 
@@ -5186,10 +5198,10 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeUndefinedMethod,
-      message:
+      problemMessage:
           """The method '${name}' isn't defined for the class '${type}'.""" +
               labeler.originMessages,
-      tip:
+      correctionMessage:
           """Try correcting the name to the name of an existing method, or defining a method named '${name}'.""",
       arguments: {'name': name, 'type': _type});
 }
@@ -5201,11 +5213,11 @@
         DartType _type,
         bool
             isNonNullableByDefault)> templateUndefinedOperator = const Template<
-        Message Function(String name, DartType _type,
-            bool isNonNullableByDefault)>(
-    messageTemplate:
+        Message Function(
+            String name, DartType _type, bool isNonNullableByDefault)>(
+    problemMessageTemplate:
         r"""The operator '#name' isn't defined for the class '#type'.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try correcting the operator to an existing operator, or defining a '#name' operator.""",
     withArguments: _withArgumentsUndefinedOperator);
 
@@ -5228,10 +5240,10 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeUndefinedOperator,
-      message:
+      problemMessage:
           """The operator '${name}' isn't defined for the class '${type}'.""" +
               labeler.originMessages,
-      tip:
+      correctionMessage:
           """Try correcting the operator to an existing operator, or defining a '${name}' operator.""",
       arguments: {'name': name, 'type': _type});
 }
@@ -5245,9 +5257,9 @@
             isNonNullableByDefault)> templateUndefinedSetter = const Template<
         Message Function(
             String name, DartType _type, bool isNonNullableByDefault)>(
-    messageTemplate:
+    problemMessageTemplate:
         r"""The setter '#name' isn't defined for the class '#type'.""",
-    tipTemplate:
+    correctionMessageTemplate:
         r"""Try correcting the name to the name of an existing setter, or defining a setter or field named '#name'.""",
     withArguments: _withArgumentsUndefinedSetter);
 
@@ -5270,10 +5282,10 @@
   List<Object> typeParts = labeler.labelType(_type);
   String type = typeParts.join();
   return new Message(codeUndefinedSetter,
-      message:
+      problemMessage:
           """The setter '${name}' isn't defined for the class '${type}'.""" +
               labeler.originMessages,
-      tip:
+      correctionMessage:
           """Try correcting the name to the name of an existing setter, or defining a setter or field named '${name}'.""",
       arguments: {'name': name, 'type': _type});
 }
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 3bf6051..15ba274 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -451,6 +451,11 @@
     return libraryBuilder.enableConstructorTearOffsInLibrary;
   }
 
+  @override
+  bool get enableNamedArgumentsAnywhereInLibrary {
+    return libraryBuilder.enableNamedArgumentsAnywhereInLibrary;
+  }
+
   void _enterLocalState({bool inLateLocalInitializer: false}) {
     _localInitializerState =
         _localInitializerState.prepend(inLateLocalInitializer);
@@ -1700,35 +1705,72 @@
       push(new ParserRecovery(beginToken.charOffset));
       return;
     }
+    List<Object?>? argumentsOriginalOrder;
+    if (libraryBuilder.enableNamedArgumentsAnywhereInLibrary) {
+      argumentsOriginalOrder = new List<Object?>.from(arguments);
+    }
     int firstNamedArgumentIndex = arguments.length;
+    int positionalCount = 0;
+    bool hasNamedBeforePositional = false;
     for (int i = 0; i < arguments.length; i++) {
       Object? node = arguments[i];
       if (node is NamedExpression) {
         firstNamedArgumentIndex =
             i < firstNamedArgumentIndex ? i : firstNamedArgumentIndex;
       } else {
+        positionalCount++;
         Expression argument = toValue(node);
         arguments[i] = argument;
+        argumentsOriginalOrder?[i] = argument;
         if (i > firstNamedArgumentIndex) {
-          arguments[i] = new NamedExpression(
-              "#$i",
-              buildProblem(fasta.messageExpectedNamedArgument,
-                  argument.fileOffset, noLength))
-            ..fileOffset = beginToken.charOffset;
+          hasNamedBeforePositional = true;
+          if (!libraryBuilder.enableNamedArgumentsAnywhereInLibrary) {
+            arguments[i] = new NamedExpression(
+                "#$i",
+                buildProblem(fasta.messageExpectedNamedArgument,
+                    argument.fileOffset, noLength))
+              ..fileOffset = beginToken.charOffset;
+          }
         }
       }
     }
+    if (!hasNamedBeforePositional) {
+      argumentsOriginalOrder = null;
+    }
     if (firstNamedArgumentIndex < arguments.length) {
-      List<Expression> positional = new List<Expression>.from(
-          arguments.getRange(0, firstNamedArgumentIndex));
-      List<NamedExpression> named = new List<NamedExpression>.from(
-          arguments.getRange(firstNamedArgumentIndex, arguments.length));
-      push(forest.createArguments(beginToken.offset, positional, named: named));
+      List<Expression> positional;
+      List<NamedExpression> named;
+      if (libraryBuilder.enableNamedArgumentsAnywhereInLibrary) {
+        positional =
+            new List<Expression>.filled(positionalCount, dummyExpression);
+        named = new List<NamedExpression>.filled(
+            arguments.length - positionalCount, dummyNamedExpression);
+        int positionalIndex = 0;
+        int namedIndex = 0;
+        for (int i = 0; i < arguments.length; i++) {
+          if (arguments[i] is NamedExpression) {
+            named[namedIndex++] = arguments[i] as NamedExpression;
+          } else {
+            positional[positionalIndex++] = arguments[i] as Expression;
+          }
+        }
+        assert(
+            positionalIndex == positional.length && namedIndex == named.length);
+      } else {
+        positional = new List<Expression>.from(
+            arguments.getRange(0, firstNamedArgumentIndex));
+        named = new List<NamedExpression>.from(
+            arguments.getRange(firstNamedArgumentIndex, arguments.length));
+      }
+
+      push(forest.createArguments(beginToken.offset, positional,
+          named: named, argumentsOriginalOrder: argumentsOriginalOrder));
     } else {
       // TODO(kmillikin): Find a way to avoid allocating a second list in the
       // case where there were no named arguments, which is a common one.
       push(forest.createArguments(
-          beginToken.offset, new List<Expression>.from(arguments)));
+          beginToken.offset, new List<Expression>.from(arguments),
+          argumentsOriginalOrder: argumentsOriginalOrder));
     }
     assert(checkState(beginToken, [ValueKinds.Arguments]));
   }
@@ -1831,7 +1873,7 @@
     } else if (arguments == null) {
       push(receiver);
     } else {
-      push(finishSend(receiver, typeArguments, arguments as Arguments,
+      push(finishSend(receiver, typeArguments, arguments as ArgumentsImpl,
           beginToken.charOffset,
           isTypeArgumentsInForest: isInForest));
     }
@@ -1847,8 +1889,11 @@
   }
 
   @override
-  Expression_Generator_Initializer finishSend(Object receiver,
-      List<UnresolvedType>? typeArguments, Arguments arguments, int charOffset,
+  Expression_Generator_Initializer finishSend(
+      Object receiver,
+      List<UnresolvedType>? typeArguments,
+      ArgumentsImpl arguments,
+      int charOffset,
       {bool isTypeArgumentsInForest = false}) {
     if (receiver is Generator) {
       return receiver.doInvocation(charOffset, typeArguments, arguments,
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 13f9ead..67b6929 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -1066,7 +1066,7 @@
           errorReporter.report(locatedMessageActualError);
         }
         return new UnevaluatedConstant(
-            new InvalidExpression(result.message.message));
+            new InvalidExpression(result.message.problemMessage));
       }
       if (result is _AbortDueToThrowConstant) {
         final Object value = result.throwValue;
@@ -1090,7 +1090,8 @@
               createLocatedMessage(node, messageConstEvalStartingPoint);
           errorReporter.report(locatedMessage, contextMessages);
         }
-        return new UnevaluatedConstant(new InvalidExpression(message.message));
+        return new UnevaluatedConstant(
+            new InvalidExpression(message.problemMessage));
       }
       if (result is _AbortDueToInvalidExpressionConstant) {
         return new UnevaluatedConstant(
@@ -4534,7 +4535,7 @@
   }
 
   void _report(LocatedMessage message) {
-    reportMessage(message.uri, message.charOffset, message.message);
+    reportMessage(message.uri, message.charOffset, message.problemMessage);
   }
 
   void reportMessage(Uri? uri, int offset, String message) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart b/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
index 4fff165..d931f8e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
@@ -362,7 +362,9 @@
       substitution.substituteType(function.returnType);
   tearOff.function.requiredParameterCount = function.requiredParameterCount;
   libraryBuilder.loader.registerTypeDependency(
-      tearOff, new TypeDependency(tearOff, constructor, substitution));
+      tearOff,
+      new TypeDependency(tearOff, constructor, substitution,
+          copyReturnType: true));
 }
 
 /// Creates the [Arguments] for passing the parameters from [tearOff] to its
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 04979e2..cd04351 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -217,7 +217,7 @@
   /// If the invocation has explicit type arguments
   /// [buildTypeWithResolvedArguments] called instead.
   Expression_Generator_Initializer doInvocation(
-      int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
+      int offset, List<UnresolvedType>? typeArguments, ArgumentsImpl arguments,
       {bool isTypeArgumentsInForest = false});
 
   Expression_Generator buildSelectorAccess(
@@ -1774,7 +1774,7 @@
 
   @override
   Expression doInvocation(
-      int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
+      int offset, List<UnresolvedType>? typeArguments, ArgumentsImpl arguments,
       {bool isTypeArgumentsInForest = false}) {
     if (invokeTarget != null) {
       return _helper.buildExtensionMethodInvocation(
@@ -1789,7 +1789,8 @@
               extensionTypeArguments: _createExtensionTypeArguments(),
               typeArguments: arguments.types,
               positionalArguments: arguments.positional,
-              namedArguments: arguments.named),
+              namedArguments: arguments.named,
+              argumentsOriginalOrder: arguments.argumentsOriginalOrder),
           isTearOff: false);
     } else {
       return _helper.forest.createExpressionInvocation(
@@ -2649,8 +2650,8 @@
     Generator generator =
         _createInstanceAccess(send.token, send.name, isNullAware: isNullAware);
     if (send.arguments != null) {
-      return generator.doInvocation(
-          offsetForToken(send.token), send.typeArguments, send.arguments!,
+      return generator.doInvocation(offsetForToken(send.token),
+          send.typeArguments, send.arguments! as ArgumentsImpl,
           isTypeArgumentsInForest: send.isTypeArgumentsInForest);
     } else {
       return generator;
@@ -2676,7 +2677,7 @@
 
   @override
   Expression_Generator_Initializer doInvocation(
-      int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
+      int offset, List<UnresolvedType>? typeArguments, ArgumentsImpl arguments,
       {bool isTypeArgumentsInForest = false}) {
     Generator generator = _createInstanceAccess(token, callName);
     return generator.doInvocation(offset, typeArguments, arguments,
@@ -2935,7 +2936,7 @@
 
   @override
   Expression_Generator_Initializer doInvocation(
-      int offset, List<UnresolvedType>? typeArguments, Arguments arguments,
+      int offset, List<UnresolvedType>? typeArguments, ArgumentsImpl arguments,
       {bool isTypeArgumentsInForest = false}) {
     Object suffix = suffixGenerator.doInvocation(
         offset, typeArguments, arguments,
@@ -3126,7 +3127,7 @@
       Selector send, int operatorOffset, bool isNullAware) {
     int nameOffset = offsetForToken(send.token);
     Name name = send.name;
-    Arguments? arguments = send.arguments;
+    ArgumentsImpl? arguments = send.arguments as ArgumentsImpl?;
 
     TypeDeclarationBuilder? declarationBuilder = declaration;
     TypeAliasBuilder? aliasBuilder;
@@ -4067,8 +4068,8 @@
         "'${send.name.text}' != ${send.token.lexeme}");
     Object result = qualifiedLookup(send.token);
     if (send is InvocationSelector) {
-      result = _helper.finishSend(
-          result, send.typeArguments, send.arguments, send.fileOffset,
+      result = _helper.finishSend(result, send.typeArguments,
+          send.arguments as ArgumentsImpl, send.fileOffset,
           isTypeArgumentsInForest: send.isTypeArgumentsInForest);
     }
     if (isNullAware) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
index 96e8b7f..9f355e5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
@@ -54,12 +54,14 @@
 
   bool get enableConstructorTearOffsInLibrary;
 
+  bool get enableNamedArgumentsAnywhereInLibrary;
+
   Expression_Generator_Builder scopeLookup(
       Scope scope, String name, Token token,
       {bool isQualified: false, PrefixBuilder? prefix});
 
   Expression_Generator_Initializer finishSend(Object receiver,
-      List<UnresolvedType>? typeArguments, Arguments arguments, int offset,
+      List<UnresolvedType>? typeArguments, ArgumentsImpl arguments, int offset,
       {bool isTypeArgumentsInForest = false});
 
   Initializer buildInvalidInitializer(Expression expression,
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 4cc99a7..8e7b3b9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -27,19 +27,25 @@
 class Forest {
   const Forest();
 
-  Arguments createArguments(int fileOffset, List<Expression> positional,
+  ArgumentsImpl createArguments(int fileOffset, List<Expression> positional,
       {List<DartType>? types,
       List<NamedExpression>? named,
-      bool hasExplicitTypeArguments = true}) {
+      bool hasExplicitTypeArguments = true,
+      List<Object?>? argumentsOriginalOrder}) {
     // ignore: unnecessary_null_comparison
     assert(fileOffset != null);
     if (!hasExplicitTypeArguments) {
-      ArgumentsImpl arguments =
-          new ArgumentsImpl(positional, types: <DartType>[], named: named);
+      ArgumentsImpl arguments = new ArgumentsImpl(positional,
+          types: <DartType>[],
+          named: named,
+          argumentsOriginalOrder: argumentsOriginalOrder);
       arguments.types.addAll(types!);
       return arguments;
     } else {
-      return new ArgumentsImpl(positional, types: types, named: named)
+      return new ArgumentsImpl(positional,
+          types: types,
+          named: named,
+          argumentsOriginalOrder: argumentsOriginalOrder)
         ..fileOffset = fileOffset;
     }
   }
@@ -53,7 +59,8 @@
       int? extensionTypeArgumentOffset,
       List<DartType> typeArguments = const <DartType>[],
       List<Expression> positionalArguments = const <Expression>[],
-      List<NamedExpression> namedArguments = const <NamedExpression>[]}) {
+      List<NamedExpression> namedArguments = const <NamedExpression>[],
+      List<Object?>? argumentsOriginalOrder}) {
     // ignore: unnecessary_null_comparison
     assert(fileOffset != null);
     return new ArgumentsImpl.forExtensionMethod(
@@ -62,11 +69,12 @@
         extensionTypeArgumentOffset: extensionTypeArgumentOffset,
         typeArguments: typeArguments,
         positionalArguments: positionalArguments,
-        namedArguments: namedArguments)
+        namedArguments: namedArguments,
+        argumentsOriginalOrder: argumentsOriginalOrder)
       ..fileOffset = fileOffset;
   }
 
-  Arguments createArgumentsEmpty(int fileOffset) {
+  ArgumentsImpl createArgumentsEmpty(int fileOffset) {
     // ignore: unnecessary_null_comparison
     assert(fileOffset != null);
     return createArguments(fileOffset, <Expression>[]);
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 9956d82..ac7b321 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -640,8 +640,8 @@
     bool hadExplicitTypeArguments = hasExplicitTypeArguments(node.arguments);
     FunctionType functionType = node.target.function
         .computeThisFunctionType(inferrer.library.nonNullable);
-    InvocationInferenceResult result = inferrer.inferInvocation(
-        typeContext, node.fileOffset, functionType, node.arguments,
+    InvocationInferenceResult result = inferrer.inferInvocation(typeContext,
+        node.fileOffset, functionType, node.arguments as ArgumentsImpl,
         isConst: node.isConst, staticTarget: node.target);
     if (!inferrer.isTopLevel) {
       SourceLibraryBuilder library = inferrer.library;
@@ -670,8 +670,8 @@
         : new FunctionType(
             [], const DynamicType(), inferrer.library.nonNullable);
     TypeArgumentsInfo typeArgumentsInfo = getTypeArgumentsInfo(node.arguments);
-    InvocationInferenceResult result = inferrer.inferInvocation(
-        typeContext, node.fileOffset, calleeType, node.arguments,
+    InvocationInferenceResult result = inferrer.inferInvocation(typeContext,
+        node.fileOffset, calleeType, node.arguments as ArgumentsImpl,
         staticTarget: node.target);
     StaticInvocation replacement =
         new StaticInvocation(node.target, node.arguments);
@@ -932,8 +932,8 @@
     FunctionType functionType = node.target.function
         .computeThisFunctionType(inferrer.library.nonNullable);
 
-    InvocationInferenceResult result = inferrer.inferInvocation(
-        typeContext, node.fileOffset, functionType, node.arguments,
+    InvocationInferenceResult result = inferrer.inferInvocation(typeContext,
+        node.fileOffset, functionType, node.arguments as ArgumentsImpl,
         isConst: node.isConst, staticTarget: node.target);
     node.hasBeenInferred = true;
     Expression resultNode = node;
@@ -963,8 +963,8 @@
         .computeAliasedConstructorFunctionType(
             typedef, inferrer.library.library);
     calleeType = replaceReturnType(calleeType, calleeType.returnType.unalias);
-    InvocationInferenceResult result = inferrer.inferInvocation(
-        typeContext, node.fileOffset, calleeType, node.arguments,
+    InvocationInferenceResult result = inferrer.inferInvocation(typeContext,
+        node.fileOffset, calleeType, node.arguments as ArgumentsImpl,
         isConst: node.isConst, staticTarget: node.target);
     node.hasBeenInferred = true;
     Expression resultNode = node;
@@ -987,8 +987,8 @@
     FunctionType calleeType = node.target.function
         .computeAliasedFactoryFunctionType(typedef, inferrer.library.library);
     calleeType = replaceReturnType(calleeType, calleeType.returnType.unalias);
-    InvocationInferenceResult result = inferrer.inferInvocation(
-        typeContext, node.fileOffset, calleeType, node.arguments,
+    InvocationInferenceResult result = inferrer.inferInvocation(typeContext,
+        node.fileOffset, calleeType, node.arguments as ArgumentsImpl,
         isConst: node.isConst, staticTarget: node.target);
     node.hasBeenInferred = true;
     Expression resultNode = node;
@@ -2827,9 +2827,16 @@
     Link<NullAwareGuard> nullAwareGuards = result.nullAwareGuards;
     Expression receiver = result.nullAwareAction;
     DartType receiverType = result.nullAwareActionType;
-    return inferrer.inferMethodInvocation(node.fileOffset, nullAwareGuards,
-        receiver, receiverType, node.name, node.arguments, typeContext,
-        isExpressionInvocation: false, isImplicitCall: false);
+    return inferrer.inferMethodInvocation(
+        node.fileOffset,
+        nullAwareGuards,
+        receiver,
+        receiverType,
+        node.name,
+        node.arguments as ArgumentsImpl,
+        typeContext,
+        isExpressionInvocation: false,
+        isImplicitCall: false);
   }
 
   ExpressionInferenceResult visitExpressionInvocation(
@@ -2839,9 +2846,16 @@
     Link<NullAwareGuard> nullAwareGuards = result.nullAwareGuards;
     Expression receiver = result.nullAwareAction;
     DartType receiverType = result.nullAwareActionType;
-    return inferrer.inferMethodInvocation(node.fileOffset, nullAwareGuards,
-        receiver, receiverType, callName, node.arguments, typeContext,
-        isExpressionInvocation: true, isImplicitCall: true);
+    return inferrer.inferMethodInvocation(
+        node.fileOffset,
+        nullAwareGuards,
+        receiver,
+        receiverType,
+        callName,
+        node.arguments as ArgumentsImpl,
+        typeContext,
+        isExpressionInvocation: true,
+        isImplicitCall: true);
   }
 
   ExpressionInferenceResult visitNamedFunctionExpressionJudgment(
@@ -5798,8 +5812,8 @@
             .computeThisFunctionType(inferrer.library.nonNullable),
         inferrer.coreTypes.thisInterfaceType(
             node.target.enclosingClass, inferrer.library.nonNullable));
-    inferrer.inferInvocation(
-        const UnknownType(), node.fileOffset, functionType, node.arguments,
+    inferrer.inferInvocation(const UnknownType(), node.fileOffset, functionType,
+        node.arguments as ArgumentsImpl,
         skipTypeArgumentInference: true, staticTarget: node.target);
     ArgumentsImpl.removeNonInferrableArgumentTypes(
         node.arguments as ArgumentsImpl);
@@ -5974,8 +5988,8 @@
         : new FunctionType(
             [], const DynamicType(), inferrer.library.nonNullable);
     TypeArgumentsInfo typeArgumentsInfo = getTypeArgumentsInfo(node.arguments);
-    InvocationInferenceResult result = inferrer.inferInvocation(
-        typeContext, node.fileOffset, calleeType, node.arguments,
+    InvocationInferenceResult result = inferrer.inferInvocation(typeContext,
+        node.fileOffset, calleeType, node.arguments as ArgumentsImpl,
         staticTarget: node.target);
     // ignore: unnecessary_null_comparison
     if (!inferrer.isTopLevel && node.target != null) {
@@ -6022,8 +6036,8 @@
             .computeThisFunctionType(inferrer.library.nonNullable)
             .withoutTypeParameters) as FunctionType,
         inferrer.thisType!);
-    inferrer.inferInvocation(
-        const UnknownType(), node.fileOffset, functionType, node.arguments,
+    inferrer.inferInvocation(const UnknownType(), node.fileOffset, functionType,
+        node.arguments as ArgumentsImpl,
         skipTypeArgumentInference: true, staticTarget: node.target);
   }
 
@@ -6770,8 +6784,8 @@
     if (node.arguments != null) {
       FunctionType calleeType =
           new FunctionType([], inferredType, inferrer.library.nonNullable);
-      inferrer.inferInvocation(
-          typeContext, node.fileOffset, calleeType, node.arguments!);
+      inferrer.inferInvocation(typeContext, node.fileOffset, calleeType,
+          node.arguments! as ArgumentsImpl);
     }
     return new ExpressionInferenceResult(inferredType, node);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
index b587d91..7560883 100644
--- a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
@@ -491,6 +491,8 @@
 
   int _explicitTypeArgumentCount;
 
+  List<Object?>? argumentsOriginalOrder;
+
   ArgumentsImpl.internal(
       {required List<Expression> positional,
       required List<DartType>? types,
@@ -504,10 +506,13 @@
             explicitExtensionTypeArgumentCount,
         this._extensionTypeArgumentOffset = extensionTypeArgumentOffset,
         this._explicitTypeArgumentCount = explicitTypeArgumentCount,
+        this.argumentsOriginalOrder = null,
         super(positional, types: types, named: named);
 
   ArgumentsImpl(List<Expression> positional,
-      {List<DartType>? types, List<NamedExpression>? named})
+      {List<DartType>? types,
+      List<NamedExpression>? named,
+      this.argumentsOriginalOrder})
       : _explicitTypeArgumentCount = types?.length ?? 0,
         _extensionTypeParameterCount = 0,
         _explicitExtensionTypeArgumentCount = 0,
@@ -521,7 +526,8 @@
       int? extensionTypeArgumentOffset,
       List<DartType> typeArguments = const <DartType>[],
       List<Expression> positionalArguments = const <Expression>[],
-      List<NamedExpression> namedArguments = const <NamedExpression>[]})
+      List<NamedExpression> namedArguments = const <NamedExpression>[],
+      this.argumentsOriginalOrder})
       : _extensionTypeParameterCount = extensionTypeParameterCount,
         _explicitExtensionTypeArgumentCount = extensionTypeArguments.length,
         _explicitTypeArgumentCount = typeArguments.length,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart
index bb99b32..bf49dae 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_helper.dart
@@ -53,7 +53,7 @@
             new CloneVisitorNotMembers(typeSubstitution: _typeSubstitution);
         clonedParameter.initializer = cloner!
             .clone(originalParameter.initializer!)
-              ..parent = clonedParameter;
+          ..parent = clonedParameter;
       }
     }
 
@@ -116,8 +116,10 @@
   final Member synthesized;
   final Member original;
   final Substitution substitution;
+  final bool copyReturnType;
 
-  TypeDependency(this.synthesized, this.original, this.substitution);
+  TypeDependency(this.synthesized, this.original, this.substitution,
+      {required this.copyReturnType});
 
   void copyInferred() {
     for (int i = 0; i < original.function!.positionalParameters.length; i++) {
@@ -136,7 +138,9 @@
       synthesizedParameter.type =
           substitution.substituteType(originalParameter.type);
     }
-    synthesized.function!.returnType =
-        substitution.substituteType(original.function!.returnType);
+    if (copyReturnType) {
+      synthesized.function!.returnType =
+          substitution.substituteType(original.function!.returnType);
+    }
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 296cbc5..1600030 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -13,7 +13,7 @@
     show ChangedStructureNotifier;
 import 'package:kernel/target/targets.dart' show DiagnosticReporter, Target;
 import 'package:kernel/transformations/value_class.dart' as valueClass;
-import 'package:kernel/type_algebra.dart' show substitute;
+import 'package:kernel/type_algebra.dart' show Substitution;
 import 'package:kernel/type_environment.dart' show TypeEnvironment;
 import 'package:package_config/package_config.dart' hide LanguageVersion;
 
@@ -522,7 +522,6 @@
       loader.checkTypes();
       loader.checkRedirectingFactories(myClasses);
       loader.checkMainMethods();
-      _updateDelayedParameterTypes();
       installAllComponentProblems(loader.allComponentProblems);
       loader.allComponentProblems.clear();
       return component;
@@ -758,17 +757,6 @@
     ticker.logMs("Installed synthetic constructors");
   }
 
-  List<DelayedParameterType> _delayedParameterTypes = <DelayedParameterType>[];
-
-  /// Update the type of parameters cloned from parameters with inferred
-  /// parameter types.
-  void _updateDelayedParameterTypes() {
-    for (DelayedParameterType delayedParameterType in _delayedParameterTypes) {
-      delayedParameterType.updateType();
-    }
-    _delayedParameterTypes.clear();
-  }
-
   ClassBuilder get objectClassBuilder => objectType.declaration as ClassBuilder;
 
   Class get objectClass => objectClassBuilder.cls;
@@ -889,26 +877,29 @@
   SyntheticConstructorBuilder _makeMixinApplicationConstructor(
       SourceClassBuilder classBuilder,
       Class mixin,
-      MemberBuilderImpl memberBuilder,
+      MemberBuilderImpl superConstructorBuilder,
       Map<TypeParameter, DartType> substitutionMap,
       Constructor? referenceFrom) {
+    bool hasTypeDependency = false;
+    Substitution substitution = Substitution.fromMap(substitutionMap);
+
     VariableDeclaration copyFormal(VariableDeclaration formal) {
       VariableDeclaration copy = new VariableDeclaration(formal.name,
           isFinal: formal.isFinal,
           isConst: formal.isConst,
           type: const UnknownType());
-      if (formal.type is! UnknownType) {
-        copy.type = substitute(formal.type, substitutionMap);
+      if (!hasTypeDependency && formal.type is! UnknownType) {
+        copy.type = substitution.substituteType(formal.type);
       } else {
-        _delayedParameterTypes
-            .add(new DelayedParameterType(formal, copy, substitutionMap));
+        hasTypeDependency = true;
       }
       return copy;
     }
 
     Class cls = classBuilder.cls;
-    Constructor constructor = memberBuilder.member as Constructor;
-    bool isConst = constructor.isConst;
+    Constructor superConstructor =
+        superConstructorBuilder.member as Constructor;
+    bool isConst = superConstructor.isConst;
     if (isConst && mixin.fields.isNotEmpty) {
       for (Field field in mixin.fields) {
         if (!field.isStatic) {
@@ -923,11 +914,12 @@
     List<NamedExpression> named = <NamedExpression>[];
 
     for (VariableDeclaration formal
-        in constructor.function.positionalParameters) {
+        in superConstructor.function.positionalParameters) {
       positionalParameters.add(copyFormal(formal));
       positional.add(new VariableGet(positionalParameters.last));
     }
-    for (VariableDeclaration formal in constructor.function.namedParameters) {
+    for (VariableDeclaration formal
+        in superConstructor.function.namedParameters) {
       VariableDeclaration clone = copyFormal(formal);
       namedParameters.add(clone);
       named.add(new NamedExpression(
@@ -936,13 +928,14 @@
     FunctionNode function = new FunctionNode(new EmptyStatement(),
         positionalParameters: positionalParameters,
         namedParameters: namedParameters,
-        requiredParameterCount: constructor.function.requiredParameterCount,
+        requiredParameterCount:
+            superConstructor.function.requiredParameterCount,
         returnType: makeConstructorReturnType(cls));
     SuperInitializer initializer = new SuperInitializer(
-        constructor, new Arguments(positional, named: named));
+        superConstructor, new Arguments(positional, named: named));
     SynthesizedFunctionNode synthesizedFunctionNode =
         new SynthesizedFunctionNode(
-            substitutionMap, constructor.function, function);
+            substitutionMap, superConstructor.function, function);
     if (!isConst) {
       // For constant constructors default values are computed and cloned part
       // of the outline expression and therefore passed to the
@@ -952,23 +945,44 @@
       // full compilation using [synthesizedFunctionNodes].
       synthesizedFunctionNodes.add(synthesizedFunctionNode);
     }
+    Constructor constructor = new Constructor(function,
+        name: superConstructor.name,
+        initializers: <Initializer>[initializer],
+        isSynthetic: true,
+        isConst: isConst,
+        reference: referenceFrom?.reference,
+        fileUri: cls.fileUri)
+      // TODO(johnniwinther): Should we add file offsets to synthesized
+      //  constructors?
+      //..fileOffset = cls.fileOffset
+      //..fileEndOffset = cls.fileOffset
+      ..isNonNullableByDefault = cls.enclosingLibrary.isNonNullableByDefault;
+
+    if (hasTypeDependency) {
+      loader.registerTypeDependency(
+          constructor,
+          new TypeDependency(constructor, superConstructor, substitution,
+              copyReturnType: false));
+    }
+
+    Procedure? constructorTearOff = createConstructorTearOffProcedure(
+        superConstructor.name.text,
+        classBuilder.library,
+        cls.fileUri,
+        cls.fileOffset,
+        forAbstractClassOrEnum: classBuilder.isAbstract);
+
+    if (constructorTearOff != null) {
+      buildConstructorTearOffProcedure(constructorTearOff, constructor,
+          classBuilder.cls, classBuilder.library);
+    }
     return new SyntheticConstructorBuilder(
-        classBuilder,
-        new Constructor(function,
-            name: constructor.name,
-            initializers: <Initializer>[initializer],
-            isSynthetic: true,
-            isConst: isConst,
-            reference: referenceFrom?.reference,
-            fileUri: cls.fileUri)
-          ..isNonNullableByDefault =
-              cls.enclosingLibrary.isNonNullableByDefault,
-        null,
+        classBuilder, constructor, constructorTearOff,
         // If the constructor is constant, the default values must be part of
         // the outline expressions. We pass on the original constructor and
         // cloned function nodes to ensure that the default values are computed
         // and cloned for the outline.
-        origin: isConst ? memberBuilder : null,
+        origin: isConst ? superConstructorBuilder : null,
         synthesizedFunctionNode: isConst ? synthesizedFunctionNode : null);
   }
 
@@ -992,10 +1006,13 @@
         reference: referenceFrom?.reference,
         fileUri: enclosingClass.fileUri)
       ..fileOffset = enclosingClass.fileOffset
+      // TODO(johnniwinther): Should we add file end offsets to synthesized
+      //  constructors?
+      //..fileEndOffset = enclosingClass.fileOffset
       ..isNonNullableByDefault =
           enclosingClass.enclosingLibrary.isNonNullableByDefault;
-    Procedure? constructorTearOff = createConstructorTearOffProcedure(
-        '', classBuilder.library, classBuilder.fileUri, constructor.fileOffset,
+    Procedure? constructorTearOff = createConstructorTearOffProcedure('',
+        classBuilder.library, enclosingClass.fileUri, enclosingClass.fileOffset,
         forAbstractClassOrEnum:
             enclosingClass.isAbstract || enclosingClass.isEnum);
     if (constructorTearOff != null) {
@@ -1599,22 +1616,3 @@
     loader.addProblem(message, charOffset, noLength, fileUri, context: context);
   }
 }
-
-/// Data for updating cloned parameters of parameters with inferred parameter
-/// types.
-///
-/// The type of [source] is not declared so the type of [target] needs to be
-/// updated when the type of [source] has been inferred.
-class DelayedParameterType {
-  final VariableDeclaration source;
-  final VariableDeclaration target;
-  final Map<TypeParameter, DartType> substitutionMap;
-
-  DelayedParameterType(this.source, this.target, this.substitutionMap);
-
-  void updateType() {
-    // ignore: unnecessary_null_comparison
-    assert(source.type is! UnknownType, "No type computed for $source.");
-    target.type = substitute(source.type, substitutionMap);
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
index 4ebcb03..79badb9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
@@ -525,6 +525,6 @@
         ? templateTypeOrigin.withArguments(toString(), importUri)
         : templateTypeOriginWithFileUri.withArguments(
             toString(), importUri, fileUri);
-    return "\n - " + message.message;
+    return "\n - " + message.problemMessage;
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/problems.dart b/pkg/front_end/lib/src/fasta/problems.dart
index eea59f1..e275e78 100644
--- a/pkg/front_end/lib/src/fasta/problems.dart
+++ b/pkg/front_end/lib/src/fasta/problems.dart
@@ -35,7 +35,7 @@
                 .withoutLocation();
 
   @override
-  String toString() => "DebugAbort: ${message.message}";
+  String toString() => "DebugAbort: ${message.problemMessage}";
 }
 
 /// Used to report an internal error.
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 dbecaaa..b046570 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
@@ -318,6 +318,7 @@
   bool? _enableGenericMetadataInLibrary;
   bool? _enableExtensionTypesInLibrary;
   bool? _enableConstructorTearOffsInLibrary;
+  bool? _enableNamedArgumentsAnywhereInLibrary;
 
   bool get enableConstFunctionsInLibrary => _enableConstFunctionsInLibrary ??=
       loader.target.isExperimentEnabledInLibraryByVersion(
@@ -392,6 +393,10 @@
           .getExperimentEnabledVersionInLibrary(
               ExperimentalFlag.extensionTypes, _packageUri ?? importUri);
 
+  bool get enableNamedArgumentsAnywhereInLibrary =>
+      _enableNamedArgumentsAnywhereInLibrary ??=
+          loader.enableUnscheduledExperiments;
+
   void _updateLibraryNNBDSettings() {
     library.isNonNullableByDefault = isNonNullableByDefault;
     switch (loader.nnbdMode) {
@@ -1329,7 +1334,7 @@
           default:
             if (member is InvalidTypeDeclarationBuilder) {
               unserializableExports ??= <String, String>{};
-              unserializableExports![name] = member.message.message;
+              unserializableExports![name] = member.message.problemMessage;
             } else {
               // Eventually (in #buildBuilder) members aren't added to the
               // library if the have 'next' pointers, so don't add them as
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 9e34d6d..4c38811 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -401,7 +401,7 @@
       double ms = elapsed.inMicroseconds / Duration.microsecondsPerMillisecond;
       Message message = template.withArguments(
           libraryCount, byteCount, ms, byteCount / ms, ms / libraryCount);
-      print("$sinceStart: ${message.message}");
+      print("$sinceStart: ${message.problemMessage}");
     });
   }
 
@@ -442,7 +442,7 @@
     severity ??= message.code.severity;
     if (severity == Severity.ignored) return null;
     String trace = """
-message: ${message.message}
+message: ${message.problemMessage}
 charOffset: $charOffset
 fileUri: $fileUri
 severity: $severity
@@ -503,6 +503,9 @@
 
   NnbdMode get nnbdMode => target.context.options.nnbdMode;
 
+  bool get enableUnscheduledExperiments =>
+      target.context.options.enableUnscheduledExperiments;
+
   CoreTypes get coreTypes {
     assert(_coreTypes != null, "CoreTypes has not been computed.");
     return _coreTypes!;
@@ -658,7 +661,8 @@
         return utf8.encode(defaultDartTypedDataSource);
 
       default:
-        return utf8.encode(message == null ? "" : "/* ${message.message} */");
+        return utf8
+            .encode(message == null ? "" : "/* ${message.problemMessage} */");
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
index 70a6813..bde992e 100644
--- a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart
@@ -237,7 +237,7 @@
       return unhandled(
           templateTypeArgumentMismatch
               .withArguments(typeVariablesCount)
-              .message,
+              .problemMessage,
           "buildTypeArguments",
           -1,
           null);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index cf74dd7..e11a372 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -272,8 +272,9 @@
     Arguments arguments;
     // ignore: unnecessary_null_comparison
     if (errorMessage != null) {
-      arguments = new Arguments(
-          [new StringLiteral(errorMessage.message)..fileOffset = fileOffset])
+      arguments = new Arguments([
+        new StringLiteral(errorMessage.problemMessage)..fileOffset = fileOffset
+      ])
         ..fileOffset = fileOffset;
     } else {
       arguments = new Arguments([])..fileOffset = fileOffset;
@@ -360,7 +361,6 @@
   }
 
   /// Ensures that the type of [member] has been computed.
-  // TODO(johnniwinther): Expand this to handle lowerings.
   void ensureMemberType(Member member) {
     if (member is Constructor) {
       inferConstructorParameterTypes(member);
@@ -2085,7 +2085,7 @@
   }
 
   InvocationInferenceResult inferInvocation(DartType typeContext, int offset,
-      FunctionType calleeType, Arguments arguments,
+      FunctionType calleeType, ArgumentsImpl arguments,
       {List<VariableDeclaration>? hoistedExpressions,
       bool isSpecialCasedBinaryOperator: false,
       bool isSpecialCasedTernaryOperator: false,
@@ -2143,7 +2143,7 @@
         typeParameters: calleeType.typeParameters
             .take(extensionTypeParameterCount)
             .toList());
-    Arguments extensionArguments = engine.forest.createArguments(
+    ArgumentsImpl extensionArguments = engine.forest.createArguments(
         arguments.fileOffset, [arguments.positional.first],
         types: getExplicitExtensionTypeArguments(arguments));
     _inferInvocation(const UnknownType(), offset, extensionFunctionType,
@@ -2171,7 +2171,7 @@
         typeParameters: targetTypeParameters);
     targetFunctionType = extensionSubstitution
         .substituteType(targetFunctionType) as FunctionType;
-    Arguments targetArguments = engine.forest.createArguments(
+    ArgumentsImpl targetArguments = engine.forest.createArguments(
         arguments.fileOffset, arguments.positional.skip(1).toList(),
         named: arguments.named, types: getExplicitTypeArguments(arguments));
     InvocationInferenceResult result = _inferInvocation(typeContext, offset,
@@ -2201,7 +2201,7 @@
       DartType typeContext,
       int offset,
       FunctionType calleeType,
-      Arguments arguments,
+      ArgumentsImpl arguments,
       List<VariableDeclaration>? hoistedExpressions,
       {bool isSpecialCasedBinaryOperator: false,
       bool isSpecialCasedTernaryOperator: false,
@@ -2215,6 +2215,7 @@
     // [receiverType] must be provided for special-cased operators.
     assert(!isSpecialCasedBinaryOperator && !isSpecialCasedTernaryOperator ||
         receiverType != null);
+
     List<TypeParameter> calleeTypeParameters = calleeType.typeParameters;
     if (calleeTypeParameters.isNotEmpty) {
       // It's possible that one of the callee type parameters might match a type
@@ -2230,11 +2231,14 @@
       calleeType = fresh.applyToFunctionType(calleeType);
       calleeTypeParameters = fresh.freshTypeParameters;
     }
+
     List<DartType>? explicitTypeArguments = getExplicitTypeArguments(arguments);
+
     bool inferenceNeeded = !skipTypeArgumentInference &&
         explicitTypeArguments == null &&
         calleeTypeParameters.isNotEmpty;
     bool typeChecksNeeded = !isTopLevel;
+
     List<DartType>? inferredTypes;
     Substitution? substitution;
     List<DartType>? formalTypes;
@@ -2243,6 +2247,15 @@
       formalTypes = [];
       actualTypes = [];
     }
+
+    List<VariableDeclaration>? localHoistedExpressions;
+    if (library.enableNamedArgumentsAnywhereInLibrary &&
+        arguments.argumentsOriginalOrder != null &&
+        hoistedExpressions == null &&
+        !isTopLevel) {
+      hoistedExpressions = localHoistedExpressions = <VariableDeclaration>[];
+    }
+
     if (inferenceNeeded) {
       // ignore: unnecessary_null_comparison
       if (isConst && typeContext != null) {
@@ -2281,60 +2294,166 @@
         staticTarget == typeSchemaEnvironment.coreTypes.identicalProcedure;
     // TODO(paulberry): if we are doing top level inference and type arguments
     // were omitted, report an error.
-    for (int position = 0; position < arguments.positional.length; position++) {
-      DartType formalType = getPositionalParameterType(calleeType, position);
-      DartType inferredFormalType = substitution != null
-          ? substitution.substituteType(formalType)
-          : formalType;
-      DartType inferredType;
-      if (isImplicitExtensionMember && position == 0) {
-        assert(
-            receiverType != null,
-            "No receiver type provided for implicit extension member "
-            "invocation.");
-        continue;
+    List<Object?> argumentsEvaluationOrder;
+    if (library.enableNamedArgumentsAnywhereInLibrary &&
+        arguments.argumentsOriginalOrder != null) {
+      if (staticTarget?.isExtensionMember ?? false) {
+        // Add the receiver.
+        argumentsEvaluationOrder = <Object?>[
+          arguments.positional[0],
+          ...arguments.argumentsOriginalOrder!
+        ];
       } else {
-        if (isSpecialCasedBinaryOperator) {
-          inferredFormalType =
-              typeSchemaEnvironment.getContextTypeOfSpecialCasedBinaryOperator(
-                  typeContext, receiverType!, inferredFormalType,
-                  isNonNullableByDefault: isNonNullableByDefault);
-        } else if (isSpecialCasedTernaryOperator) {
-          inferredFormalType =
-              typeSchemaEnvironment.getContextTypeOfSpecialCasedTernaryOperator(
-                  typeContext, receiverType!, inferredFormalType,
-                  isNonNullableByDefault: isNonNullableByDefault);
+        argumentsEvaluationOrder = arguments.argumentsOriginalOrder!;
+      }
+    } else {
+      argumentsEvaluationOrder = <Object?>[
+        ...arguments.positional,
+        ...arguments.named
+      ];
+    }
+    arguments.argumentsOriginalOrder = null;
+
+    // The following loop determines how many argument expressions should be
+    // hoisted to preserve the evaluation order. The computation is based on the
+    // following observation: the largest suffix of the argument vector, such
+    // that every positional argument in that suffix comes before any named
+    // argument, retains the evaluation order after the rest of the arguments
+    // are hoisted, and therefore doesn't need to be hoisted itself. The loop
+    // below finds the starting position of such suffix and stores it in the
+    // [hoistingEndIndex] variable. In case all positional arguments come
+    // before all named arguments, the suffix coincides with the entire argument
+    // vector, and none of the arguments is hoisted. That way the legacy
+    // behavior is preserved.
+    int hoistingEndIndex;
+    if (library.enableNamedArgumentsAnywhereInLibrary) {
+      hoistingEndIndex = argumentsEvaluationOrder.length - 1;
+      for (int i = argumentsEvaluationOrder.length - 2;
+          i >= 0 && hoistingEndIndex == i + 1;
+          i--) {
+        int previousWeight =
+            argumentsEvaluationOrder[i + 1] is NamedExpression ? 1 : 0;
+        int currentWeight =
+            argumentsEvaluationOrder[i] is NamedExpression ? 1 : 0;
+        if (currentWeight <= previousWeight) {
+          --hoistingEndIndex;
         }
+      }
+    } else {
+      hoistingEndIndex = 0;
+    }
+
+    int positionalIndex = 0;
+    int namedIndex = 0;
+    for (int evaluationOrderIndex = 0;
+        evaluationOrderIndex < argumentsEvaluationOrder.length;
+        evaluationOrderIndex++) {
+      Object? argument = argumentsEvaluationOrder[evaluationOrderIndex];
+      assert(
+          argument is Expression || argument is NamedExpression,
+          "Expected the argument to be either an Expression "
+          "or a NamedExpression, got '${argument.runtimeType}'.");
+      if (argument is Expression) {
+        int index = positionalIndex++;
+        DartType formalType = getPositionalParameterType(calleeType, index);
+        DartType inferredFormalType = substitution != null
+            ? substitution.substituteType(formalType)
+            : formalType;
+        DartType inferredType;
+        if (isImplicitExtensionMember && index == 0) {
+          assert(
+              receiverType != null,
+              "No receiver type provided for implicit extension member "
+              "invocation.");
+          continue;
+        } else {
+          if (isSpecialCasedBinaryOperator) {
+            inferredFormalType = typeSchemaEnvironment
+                .getContextTypeOfSpecialCasedBinaryOperator(
+                    typeContext, receiverType!, inferredFormalType,
+                    isNonNullableByDefault: isNonNullableByDefault);
+          } else if (isSpecialCasedTernaryOperator) {
+            inferredFormalType = typeSchemaEnvironment
+                .getContextTypeOfSpecialCasedTernaryOperator(
+                    typeContext, receiverType!, inferredFormalType,
+                    isNonNullableByDefault: isNonNullableByDefault);
+          }
+          ExpressionInferenceResult result = inferExpression(
+              arguments.positional[index],
+              isNonNullableByDefault
+                  ? inferredFormalType
+                  : legacyErasure(inferredFormalType),
+              inferenceNeeded ||
+                  isSpecialCasedBinaryOperator ||
+                  isSpecialCasedTernaryOperator ||
+                  typeChecksNeeded);
+          inferredType = identical(result.inferredType, noInferredType) ||
+                  isNonNullableByDefault
+              ? result.inferredType
+              : legacyErasure(result.inferredType);
+          if (localHoistedExpressions != null &&
+              evaluationOrderIndex >= hoistingEndIndex) {
+            hoistedExpressions = null;
+          }
+          Expression expression =
+              _hoist(result.expression, inferredType, hoistedExpressions);
+          if (isIdentical && arguments.positional.length == 2) {
+            if (index == 0) {
+              flowAnalysis.equalityOp_rightBegin(expression, inferredType);
+            } else {
+              flowAnalysis.equalityOp_end(
+                  arguments.parent as Expression, expression, inferredType);
+            }
+          }
+          arguments.positional[index] = expression..parent = arguments;
+        }
+        if (inferenceNeeded || typeChecksNeeded) {
+          formalTypes!.add(formalType);
+          actualTypes!.add(inferredType);
+        }
+      } else {
+        assert(argument is NamedExpression);
+        int index = namedIndex++;
+        NamedExpression namedArgument = arguments.named[index];
+        DartType formalType =
+            getNamedParameterType(calleeType, namedArgument.name);
+        DartType inferredFormalType = substitution != null
+            ? substitution.substituteType(formalType)
+            : formalType;
         ExpressionInferenceResult result = inferExpression(
-            arguments.positional[position],
+            namedArgument.value,
             isNonNullableByDefault
                 ? inferredFormalType
                 : legacyErasure(inferredFormalType),
             inferenceNeeded ||
                 isSpecialCasedBinaryOperator ||
-                isSpecialCasedTernaryOperator ||
                 typeChecksNeeded);
-        inferredType = identical(result.inferredType, noInferredType) ||
-                isNonNullableByDefault
-            ? result.inferredType
-            : legacyErasure(result.inferredType);
+        DartType inferredType =
+            identical(result.inferredType, noInferredType) ||
+                    isNonNullableByDefault
+                ? result.inferredType
+                : legacyErasure(result.inferredType);
+        if (localHoistedExpressions != null &&
+            evaluationOrderIndex >= hoistingEndIndex) {
+          hoistedExpressions = null;
+        }
         Expression expression =
             _hoist(result.expression, inferredType, hoistedExpressions);
-        if (isIdentical && arguments.positional.length == 2) {
-          if (position == 0) {
-            flowAnalysis.equalityOp_rightBegin(expression, inferredType);
-          } else {
-            flowAnalysis.equalityOp_end(
-                arguments.parent as Expression, expression, inferredType);
-          }
+        namedArgument.value = expression..parent = namedArgument;
+        if (inferenceNeeded || typeChecksNeeded) {
+          formalTypes!.add(formalType);
+          actualTypes!.add(inferredType);
         }
-        arguments.positional[position] = expression..parent = arguments;
-      }
-      if (inferenceNeeded || typeChecksNeeded) {
-        formalTypes!.add(formalType);
-        actualTypes!.add(inferredType);
       }
     }
+    assert(
+        positionalIndex == arguments.positional.length,
+        "Expected 'positionalIndex' to be ${arguments.positional.length}, "
+        "got ${positionalIndex}.");
+    assert(
+        namedIndex == arguments.named.length,
+        "Expected 'namedIndex' to be ${arguments.named.length}, "
+        "got ${namedIndex}.");
     if (isSpecialCasedBinaryOperator) {
       calleeType = replaceReturnType(
           calleeType,
@@ -2347,30 +2466,6 @@
           typeSchemaEnvironment.getTypeOfSpecialCasedTernaryOperator(
               receiverType!, actualTypes![0], actualTypes[1], library.library));
     }
-    for (NamedExpression namedArgument in arguments.named) {
-      DartType formalType =
-          getNamedParameterType(calleeType, namedArgument.name);
-      DartType inferredFormalType = substitution != null
-          ? substitution.substituteType(formalType)
-          : formalType;
-      ExpressionInferenceResult result = inferExpression(
-          namedArgument.value,
-          isNonNullableByDefault
-              ? inferredFormalType
-              : legacyErasure(inferredFormalType),
-          inferenceNeeded || isSpecialCasedBinaryOperator || typeChecksNeeded);
-      DartType inferredType = identical(result.inferredType, noInferredType) ||
-              isNonNullableByDefault
-          ? result.inferredType
-          : legacyErasure(result.inferredType);
-      Expression expression =
-          _hoist(result.expression, inferredType, hoistedExpressions);
-      namedArgument.value = expression..parent = namedArgument;
-      if (inferenceNeeded || typeChecksNeeded) {
-        formalTypes!.add(formalType);
-        actualTypes!.add(inferredType);
-      }
-    }
 
     // Check for and remove duplicated named arguments.
     List<NamedExpression> named = arguments.named;
@@ -2516,7 +2611,9 @@
       calleeType = legacyErasure(calleeType) as FunctionType;
     }
 
-    return new SuccessfulInferenceResult(inferredType, calleeType);
+    return new SuccessfulInferenceResult(inferredType, calleeType,
+        hoistedArguments: localHoistedExpressions,
+        inferredReceiverType: receiverType);
   }
 
   FunctionType inferLocalFunction(FunctionNode function, DartType? typeContext,
@@ -2767,7 +2864,7 @@
       Link<NullAwareGuard> nullAwareGuards,
       Expression receiver,
       Name name,
-      Arguments arguments,
+      ArgumentsImpl arguments,
       DartType typeContext,
       List<VariableDeclaration>? hoistedExpressions,
       {required bool isImplicitCall}) {
@@ -2792,7 +2889,7 @@
       Expression receiver,
       NeverType receiverType,
       Name name,
-      Arguments arguments,
+      ArgumentsImpl arguments,
       DartType typeContext,
       List<VariableDeclaration>? hoistedExpressions,
       {required bool isImplicitCall}) {
@@ -2820,7 +2917,7 @@
       DartType receiverType,
       ObjectAccessTarget target,
       Name name,
-      Arguments arguments,
+      ArgumentsImpl arguments,
       DartType typeContext,
       List<VariableDeclaration>? hoistedExpressions,
       {required bool isExpressionInvocation,
@@ -2854,7 +2951,7 @@
       DartType receiverType,
       ObjectAccessTarget target,
       Name name,
-      Arguments arguments,
+      ArgumentsImpl arguments,
       DartType typeContext,
       List<VariableDeclaration>? hoistedExpressions,
       {required bool isImplicitCall}) {
@@ -2905,8 +3002,8 @@
     } else {
       StaticInvocation staticInvocation = transformExtensionMethodInvocation(
           fileOffset, target, receiver, arguments);
-      InvocationInferenceResult result = inferInvocation(
-          typeContext, fileOffset, functionType, staticInvocation.arguments,
+      InvocationInferenceResult result = inferInvocation(typeContext,
+          fileOffset, functionType, staticInvocation.arguments as ArgumentsImpl,
           hoistedExpressions: hoistedExpressions,
           receiverType: receiverType,
           isImplicitExtensionMember: true,
@@ -2969,7 +3066,7 @@
       Expression receiver,
       DartType receiverType,
       ObjectAccessTarget target,
-      Arguments arguments,
+      ArgumentsImpl arguments,
       DartType typeContext,
       List<VariableDeclaration>? hoistedExpressions,
       {required bool isImplicitCall}) {
@@ -3122,8 +3219,8 @@
             method.enclosingClass!, method.function.returnType)) {
       contravariantCheck = true;
     }
-    InvocationInferenceResult result = inferInvocation(
-        typeContext, fileOffset, declaredFunctionType, arguments,
+    InvocationInferenceResult result = inferInvocation(typeContext, fileOffset,
+        declaredFunctionType, arguments as ArgumentsImpl,
         hoistedExpressions: hoistedExpressions,
         receiverType: receiverType,
         isImplicitCall: isImplicitCall,
@@ -3238,7 +3335,7 @@
       Expression receiver,
       DartType receiverType,
       ObjectAccessTarget target,
-      Arguments arguments,
+      ArgumentsImpl arguments,
       DartType typeContext,
       List<VariableDeclaration>? hoistedExpressions,
       {required bool isExpressionInvocation}) {
@@ -3445,7 +3542,7 @@
       Expression receiver,
       DartType receiverType,
       ObjectAccessTarget target,
-      Arguments arguments,
+      ArgumentsImpl arguments,
       DartType typeContext,
       List<VariableDeclaration>? hoistedExpressions,
       {required bool isExpressionInvocation}) {
@@ -3619,7 +3716,7 @@
       Expression receiver,
       DartType receiverType,
       Name name,
-      Arguments arguments,
+      ArgumentsImpl arguments,
       DartType typeContext,
       {required bool isExpressionInvocation,
       required bool isImplicitCall,
@@ -3842,7 +3939,7 @@
         : const ObjectAccessTarget.missing();
     int fileOffset = expression.fileOffset;
     Name methodName = expression.name;
-    Arguments arguments = expression.arguments;
+    ArgumentsImpl arguments = expression.arguments as ArgumentsImpl;
     DartType receiverType = thisType!;
     bool isSpecialCasedBinaryOperator =
         isSpecialCasedBinaryOperatorForReceiverType(target, receiverType);
@@ -4772,10 +4869,65 @@
   @override
   final FunctionType functionType;
 
-  SuccessfulInferenceResult(this.inferredType, this.functionType);
+  final List<VariableDeclaration>? hoistedArguments;
+
+  final DartType? inferredReceiverType;
+
+  SuccessfulInferenceResult(this.inferredType, this.functionType,
+      {this.hoistedArguments, this.inferredReceiverType});
 
   @override
-  Expression applyResult(Expression expression) => expression;
+  Expression applyResult(Expression expression) {
+    List<VariableDeclaration>? hoistedArguments = this.hoistedArguments;
+    if (hoistedArguments == null || hoistedArguments.isEmpty) {
+      return expression;
+    } else {
+      assert(expression is InvocationExpression);
+      if (expression is FactoryConstructorInvocation) {
+        return _insertHoistedExpressions(expression, hoistedArguments);
+      } else if (expression is TypeAliasedConstructorInvocation) {
+        // Should be unaliased at this point, the code is for completeness.
+        return _insertHoistedExpressions(expression, hoistedArguments);
+      } else if (expression is TypeAliasedFactoryInvocation) {
+        // Should be unaliased at this point, the code is for completeness.
+        return expression;
+      } else if (expression is ConstructorInvocation) {
+        return _insertHoistedExpressions(expression, hoistedArguments);
+      } else if (expression is DynamicInvocation) {
+        return _insertHoistedExpressions(expression, hoistedArguments);
+      } else if (expression is FunctionInvocation) {
+        return _insertHoistedExpressions(expression, hoistedArguments);
+      } else if (expression is InstanceGetterInvocation) {
+        // The hoisting of InstanceGetterInvocation is performed elsewhere.
+        return expression;
+      } else if (expression is InstanceInvocation) {
+        VariableDeclaration receiver = createVariable(
+            expression.receiver, inferredReceiverType ?? const DynamicType());
+        expression.receiver = createVariableGet(receiver)..parent = expression;
+        return createLet(
+            receiver, _insertHoistedExpressions(expression, hoistedArguments));
+      } else if (expression is LocalFunctionInvocation) {
+        return _insertHoistedExpressions(expression, hoistedArguments);
+      } else if (expression is StaticInvocation) {
+        return _insertHoistedExpressions(expression, hoistedArguments);
+      } else if (expression is SuperMethodInvocation) {
+        return _insertHoistedExpressions(expression, hoistedArguments);
+      } else {
+        throw new StateError(
+            "Unhandled invocation kind '${expression.runtimeType}'.");
+      }
+    }
+  }
+
+  static Expression _insertHoistedExpressions(
+      Expression expression, List<VariableDeclaration> hoistedExpressions) {
+    if (hoistedExpressions.isNotEmpty) {
+      for (int index = hoistedExpressions.length - 1; index >= 0; index--) {
+        expression = createLet(hoistedExpressions[index], expression);
+      }
+    }
+    return expression;
+  }
 
   @override
   bool get isInapplicable => false;
diff --git a/pkg/front_end/lib/src/testing/id_testing_utils.dart b/pkg/front_end/lib/src/testing/id_testing_utils.dart
index 9aad4b2..f9729d3 100644
--- a/pkg/front_end/lib/src/testing/id_testing_utils.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_utils.dart
@@ -734,7 +734,7 @@
   if (useCodes) {
     return errors.map((m) => m.code).join(',');
   } else {
-    return errors.map((m) => m.message).join(',');
+    return errors.map((m) => m.problemMessage).join(',');
   }
 }
 
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index d3859ab..78090a5 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -50,6 +50,12 @@
 # which will be used when generating code in Analyzer for translating
 # fasta error codes to Analyzer error codes.
 #
+# Errors with an `index` can also optionally contain user-facing documentation
+# for the problem (documentation), which will be extracted to
+# `pkg/analyzer/tool/diagnostics/diagnostics.md`, as well as internal
+# documentation (comment), which will be included in the code generated for the
+# analyzer.
+#
 # In some cases a message is internal to the frontend, and no meaningful
 # analyzer code can be provided. In such cases set `frontendInternal: true`.
 #
@@ -829,6 +835,9 @@
   problemMessage: "The modifier '#lexeme' was already specified."
   correctionMessage: "Try removing all but one occurrence of the modifier."
   analyzerCode: ParserErrorCode.DUPLICATED_MODIFIER
+  comment: |-
+    Parameters:
+    0: the modifier that was duplicated
   script:
     - "class C { const const m; }"
     - "class C { external external f(); }"
@@ -972,6 +981,35 @@
   correctionMessage: "Try removing '#lexeme'."
   analyzerCode: ParserErrorCode.INVALID_USE_OF_COVARIANT_IN_EXTENSION
   hasPublishedDocs: true
+  comment: No parameters.
+  documentation: |-
+    #### Description
+
+    The analyzer produces this diagnostic when a member declared inside an
+    extension uses the keyword `covariant` in the declaration of a parameter.
+    Extensions aren't classes and don't have subclasses, so the keyword serves
+    no purpose.
+
+    #### Examples
+
+    The following code produces this diagnostic because `i` is marked as being
+    covariant:
+
+    ```dart
+    extension E on String {
+      void a([!covariant!] int i) {}
+    }
+    ```
+
+    #### Common fixes
+
+    Remove the `covariant` keyword:
+
+    ```dart
+    extension E on String {
+      void a(int i) {}
+    }
+    ```
   script:
     - "extension on String { foo(covariant String child) {} }"
 
@@ -1119,6 +1157,9 @@
   problemMessage: "The label '#name' was already used in this switch statement."
   correctionMessage: "Try choosing a different name for this label."
   analyzerCode: ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT
+  comment: |-
+    Parameters:
+    0: the label that was duplicated
   statement:
     - "switch (0) {l1: case 0: break; l1: case 1: break;}"
 
@@ -2191,6 +2232,27 @@
   problemMessage: "Extensions can't declare abstract members."
   correctionMessage: "Try providing an implementation for the member."
   analyzerCode: ParserErrorCode.EXTENSION_DECLARES_ABSTRACT_MEMBER
+  comment: No parameters.
+  documentation: |-
+    #### Description
+
+    The analyzer produces this diagnostic when an abstract declaration is
+    declared in an extension. Extensions can declare only concrete members.
+
+    #### Examples
+
+    The following code produces this diagnostic because the method `a` doesn't
+    have a body:
+
+    ```dart
+    extension E on String {
+      int [!a!]();
+    }
+    ```
+
+    #### Common fixes
+
+    Either provide an implementation for the member or remove it.
   hasPublishedDocs: true
 
 ExtensionDeclaresConstructor:
@@ -2198,6 +2260,29 @@
   problemMessage: "Extensions can't declare constructors."
   correctionMessage: "Try removing the constructor declaration."
   analyzerCode: ParserErrorCode.EXTENSION_DECLARES_CONSTRUCTOR
+  comment: No parameters.
+  documentation: |-
+    #### Description
+
+    The analyzer produces this diagnostic when a constructor declaration is
+    found in an extension. It isn't valid to define a constructor because
+    extensions aren't classes, and it isn't possible to create an instance of
+    an extension.
+
+    #### Examples
+
+    The following code produces this diagnostic because there is a constructor
+    declaration in `E`:
+
+    ```dart
+    extension E on String {
+      [!E!]() : super();
+    }
+    ```
+
+    #### Common fixes
+
+    Remove the constructor or replace it with a static method.
   hasPublishedDocs: true
 
 ExtensionDeclaresInstanceField:
@@ -2205,6 +2290,30 @@
   problemMessage: "Extensions can't declare instance fields"
   correctionMessage: "Try removing the field declaration or making it a static field"
   analyzerCode: ParserErrorCode.EXTENSION_DECLARES_INSTANCE_FIELD
+  comment: No parameters.
+  documentation: |-
+    #### Description
+
+    The analyzer produces this diagnostic when an instance field declaration is
+    found in an extension. It isn't valid to define an instance field because
+    extensions can only add behavior, not state.
+
+    #### Examples
+
+    The following code produces this diagnostic because `s` is an instance
+    field:
+
+    ```dart
+    %language=2.9
+    extension E on String {
+      String [!s!];
+    }
+    ```
+
+    #### Common fixes
+
+    Remove the field, make it a static field, or convert it to be a getter,
+    setter, or method.
   hasPublishedDocs: true
 
 ConflictsWithConstructor:
@@ -3019,6 +3128,9 @@
   index: 39
   problemMessage: "The string '#lexeme' isn't a user-definable operator."
   analyzerCode: ParserErrorCode.INVALID_OPERATOR
+  comment: |-
+    Parameters:
+    0: the operator that is invalid
   script:
     - "class C { void operator %=(x) {} }"
 
diff --git a/pkg/front_end/test/extensions/extensions_test.dart b/pkg/front_end/test/extensions/extensions_test.dart
index 2666476..5765b21 100644
--- a/pkg/front_end/test/extensions/extensions_test.dart
+++ b/pkg/front_end/test/extensions/extensions_test.dart
@@ -89,11 +89,11 @@
       Id id, List<FormattedMessage> errors) {
     Features features = new Features();
     for (FormattedMessage error in errors) {
-      if (error.message.contains(',')) {
+      if (error.problemMessage.contains(',')) {
         // TODO(johnniwinther): Support escaping of , in Features.
         features.addElement(Tags.errors, error.code);
       } else {
-        features.addElement(Tags.errors, error.message);
+        features.addElement(Tags.errors, error.problemMessage);
       }
     }
     return features;
diff --git a/pkg/front_end/test/fasta/messages_suite.dart b/pkg/front_end/test/fasta/messages_suite.dart
index 152fa07..99579c9 100644
--- a/pkg/front_end/test/fasta/messages_suite.dart
+++ b/pkg/front_end/test/fasta/messages_suite.dart
@@ -386,6 +386,19 @@
             }
             break;
 
+          case "documentation":
+            if (value is! String) {
+              throw new ArgumentError(
+                  'documentation should be a string: $value.');
+            }
+            break;
+
+          case "comment":
+            if (value is! String) {
+              throw new ArgumentError('comment should be a string: $value.');
+            }
+            break;
+
           default:
             unknownKeys.add(key);
         }
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index 387f68f..4275910 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -227,6 +227,7 @@
 
 const List<Option> folderOptionsSpecification = [
   Options.enableExperiment,
+  Options.enableUnscheduledExperiments,
   Options.forceLateLoweringSentinel,
   overwriteCurrentSdkVersion,
   Options.forceLateLowering,
@@ -261,6 +262,7 @@
 /// test folders.
 class FolderOptions {
   final Map<ExperimentalFlag, bool> _explicitExperimentalFlags;
+  final bool? enableUnscheduledExperiments;
   final int? forceLateLowerings;
   final bool? forceLateLoweringSentinel;
   final bool? forceStaticFieldLowering;
@@ -273,7 +275,8 @@
   final String? overwriteCurrentSdkVersion;
 
   FolderOptions(this._explicitExperimentalFlags,
-      {this.forceLateLowerings,
+      {this.enableUnscheduledExperiments,
+      this.forceLateLowerings,
       this.forceLateLoweringSentinel,
       this.forceStaticFieldLowering,
       this.forceNoExplicitGetterCalls,
@@ -441,6 +444,7 @@
   FolderOptions _computeFolderOptions(Directory directory) {
     FolderOptions? folderOptions = _folderOptions[directory.uri];
     if (folderOptions == null) {
+      bool? enableUnscheduledExperiments;
       int? forceLateLowering;
       bool? forceLateLoweringSentinel;
       bool? forceStaticFieldLowering;
@@ -452,6 +456,7 @@
       String target = "vm";
       if (directory.uri == baseUri) {
         folderOptions = new FolderOptions({},
+            enableUnscheduledExperiments: enableUnscheduledExperiments,
             forceLateLowerings: forceLateLowering,
             forceLateLoweringSentinel: forceLateLoweringSentinel,
             forceStaticFieldLowering: forceStaticFieldLowering,
@@ -473,6 +478,8 @@
               Options.enableExperiment.read(parsedOptions) ?? <String>[];
           String overwriteCurrentSdkVersionArgument =
               overwriteCurrentSdkVersion.read(parsedOptions);
+          enableUnscheduledExperiments =
+              Options.enableUnscheduledExperiments.read(parsedOptions);
           forceLateLoweringSentinel =
               Options.forceLateLoweringSentinel.read(parsedOptions);
           forceLateLowering = Options.forceLateLowering.read(parsedOptions);
@@ -499,6 +506,7 @@
                   onError: (String message) => throw new ArgumentError(message),
                   onWarning: (String message) =>
                       throw new ArgumentError(message)),
+              enableUnscheduledExperiments: enableUnscheduledExperiments,
               forceLateLowerings: forceLateLowering,
               forceLateLoweringSentinel: forceLateLoweringSentinel,
               forceStaticFieldLowering: forceStaticFieldLowering,
@@ -541,6 +549,8 @@
         }
         ..sdkRoot = sdk
         ..packagesFileUri = uriConfiguration.packageConfigUri ?? packages
+        ..enableUnscheduledExperiments =
+            folderOptions.enableUnscheduledExperiments ?? false
         ..environmentDefines = folderOptions.defines
         ..explicitExperimentalFlags = folderOptions
             .computeExplicitExperimentalFlags(explicitExperimentalFlags)
@@ -1094,6 +1104,8 @@
       ..onDiagnostic = (DiagnosticMessage message) {
         errors.add(message.plainTextFormatted);
       }
+      ..enableUnscheduledExperiments =
+          folderOptions.enableUnscheduledExperiments ?? false
       ..environmentDefines = folderOptions.defines
       ..explicitExperimentalFlags = experimentalFlags
       ..nnbdMode = nnbdMode
diff --git a/pkg/front_end/test/fasta/tool_git_test.dart b/pkg/front_end/test/fasta/tool_git_test.dart
index fde2e4e..3755f18 100644
--- a/pkg/front_end/test/fasta/tool_git_test.dart
+++ b/pkg/front_end/test/fasta/tool_git_test.dart
@@ -54,7 +54,7 @@
   }
   Set<String> testedSubtools = new Set<String>.from(subtools)
       .difference(new Set<String>.from(unsafeTools));
-  String usage = messageFastaUsageShort.message;
+  String usage = messageFastaUsageShort.problemMessage;
   Map expectations = {
     "abcompile": {
       "exitCode": 1,
diff --git a/pkg/front_end/test/kernel_generator_test.dart b/pkg/front_end/test/kernel_generator_test.dart
index cf8ce12..275df00 100644
--- a/pkg/front_end/test/kernel_generator_test.dart
+++ b/pkg/front_end/test/kernel_generator_test.dart
@@ -20,9 +20,10 @@
         test;
 
 import 'package:front_end/src/api_prototype/front_end.dart'
-    show CompilerOptions;
+    show CompilerOptions, DiagnosticMessage;
 
-import 'package:front_end/src/fasta/fasta_codes.dart' show messageMissingMain;
+import 'package:front_end/src/fasta/fasta_codes.dart'
+    show FormattedMessage, messageMissingMain;
 
 import 'package:front_end/src/fasta/kernel/utils.dart' show serializeComponent;
 
@@ -84,10 +85,11 @@
     });
 
     test('compiler requires a main method', () async {
-      var errors = [];
+      var errors = <DiagnosticMessage>[];
       var options = new CompilerOptions()..onDiagnostic = errors.add;
       await compileScript('a() => print("hi");', options: options);
-      expect(errors.first.message, messageMissingMain.message);
+      expect((errors.first as FormattedMessage).problemMessage,
+          messageMissingMain.problemMessage);
     });
 
     test('generated program contains source-info', () async {
diff --git a/pkg/front_end/test/messages_json_test.dart b/pkg/front_end/test/messages_json_test.dart
index dff07bd..8df7698 100644
--- a/pkg/front_end/test/messages_json_test.dart
+++ b/pkg/front_end/test/messages_json_test.dart
@@ -23,7 +23,7 @@
   for (int i = 0; i < Severity.values.length; i++) {
     Severity severity = Severity.values[i];
     Code code = new Code("MyCodeName");
-    Message message = new Message(code, message: '');
+    Message message = new Message(code, problemMessage: '');
     LocatedMessage locatedMessage1 =
         new LocatedMessage(Uri.parse("what:ever/fun_1.dart"), 117, 2, message);
     FormattedMessage formattedMessage2 = new FormattedMessage(
diff --git a/pkg/front_end/test/parser_suite.dart b/pkg/front_end/test/parser_suite.dart
index cdb9645..cb24755 100644
--- a/pkg/front_end/test/parser_suite.dart
+++ b/pkg/front_end/test/parser_suite.dart
@@ -526,9 +526,9 @@
           location,
           length,
           shortName,
-          message.message));
+          message.problemMessage));
     } else {
-      errors.add(message.message);
+      errors.add(message.problemMessage);
     }
 
     super.handleRecoverableError(message, startToken, endToken);
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index dd9f732..93046af 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -488,6 +488,7 @@
 closures
 clue
 code
+coincides
 coinductively
 collapses
 collect
@@ -1397,6 +1398,7 @@
 historically
 hoist
 hoisted
+hoisting
 hold
 holder
 holding
@@ -2574,6 +2576,7 @@
 resynthesize
 retain
 retained
+retains
 rethrow
 rethrowing
 retired
@@ -3218,6 +3221,7 @@
 unresolved
 unsafe
 unsatisfied
+unscheduled
 unserializable
 unsigned
 unsized
diff --git a/pkg/front_end/test/src/base/processed_options_test.dart b/pkg/front_end/test/src/base/processed_options_test.dart
index b771f32..00c3a75 100644
--- a/pkg/front_end/test/src/base/processed_options_test.dart
+++ b/pkg/front_end/test/src/base/processed_options_test.dart
@@ -323,7 +323,7 @@
   }
 
   Future<void> test_getUriTranslator_noPackages() async {
-    var errors = [];
+    var errors = <DiagnosticMessage>[];
     // .packages file should be ignored.
     fileSystem
         .entityForUri(Uri.parse('org-dartlang-test:///.packages'))
@@ -335,7 +335,7 @@
     var processed = new ProcessedOptions(options: raw);
     var uriTranslator = await processed.getUriTranslator();
     expect(uriTranslator.packages.packages, isEmpty);
-    expect(errors.single.message,
+    expect((errors.single as FormattedMessage).problemMessage,
         startsWith(_stringPrefixOf(templateCantReadFile)));
   }
 
@@ -343,13 +343,14 @@
     fileSystem
         .entityForUri(Uri.parse('org-dartlang-test:///foo.dart'))
         .writeAsStringSync('main(){}\n');
-    var errors = [];
+    var errors = <DiagnosticMessage>[];
     var raw = new CompilerOptions()
       ..fileSystem = fileSystem
       ..onDiagnostic = errors.add;
     var options = new ProcessedOptions(options: raw);
     var result = await options.validateOptions();
-    expect(errors.single.message, messageMissingInput.message);
+    expect((errors.single as FormattedMessage).problemMessage,
+        messageMissingInput.problemMessage);
     expect(result, isFalse);
   }
 
@@ -397,7 +398,7 @@
         .entityForUri(Uri.parse('org-dartlang-test:///foo.dart'))
         .writeAsStringSync('main(){}\n');
     var sdkRoot = Uri.parse('org-dartlang-test:///sdk/root');
-    var errors = [];
+    var errors = <DiagnosticMessage>[];
     var raw = new CompilerOptions()
       ..sdkRoot = sdkRoot
       ..fileSystem = fileSystem
@@ -405,7 +406,7 @@
     var options =
         new ProcessedOptions(options: raw, inputs: [Uri.parse('foo.dart')]);
     expect(await options.validateOptions(), isFalse);
-    expect(errors.first.message,
+    expect((errors.first as FormattedMessage).problemMessage,
         startsWith(_stringPrefixOf(templateSdkRootNotFound)));
   }
 
@@ -433,7 +434,7 @@
         .entityForUri(Uri.parse('org-dartlang-test:///foo.dart'))
         .writeAsStringSync('main(){}\n');
     var sdkSummary = Uri.parse('org-dartlang-test:///sdk/root/outline.dill');
-    var errors = [];
+    var errors = <DiagnosticMessage>[];
     var raw = new CompilerOptions()
       ..sdkSummary = sdkSummary
       ..fileSystem = fileSystem
@@ -441,7 +442,7 @@
     var options =
         new ProcessedOptions(options: raw, inputs: [Uri.parse('foo.dart')]);
     expect(await options.validateOptions(), isFalse);
-    expect(errors.single.message,
+    expect((errors.single as FormattedMessage).problemMessage,
         startsWith(_stringPrefixOf(templateSdkSummaryNotFound)));
   }
 
@@ -474,7 +475,7 @@
     fileSystem
         .entityForUri(Uri.parse('org-dartlang-test:///foo.dart'))
         .writeAsStringSync('main(){}\n');
-    var errors = [];
+    var errors = <DiagnosticMessage>[];
     var raw = new CompilerOptions()
       ..sdkSummary = sdkSummary
       ..fileSystem = fileSystem
@@ -482,14 +483,14 @@
     var options =
         new ProcessedOptions(options: raw, inputs: [Uri.parse('foo.dart')]);
     expect(await options.validateOptions(), isFalse);
-    expect(errors.single.message,
+    expect((errors.single as FormattedMessage).problemMessage,
         startsWith(_stringPrefixOf(templateSdkSummaryNotFound)));
   }
 
   /// Returns the longest prefix of the text in a message template that doesn't
   /// mention a template argument.
   String _stringPrefixOf(Template template) {
-    var messageTemplate = template.messageTemplate;
+    var messageTemplate = template.problemMessageTemplate;
     var index = messageTemplate.indexOf('#');
     var prefix = messageTemplate.substring(0, index - 1);
 
diff --git a/pkg/front_end/test/static_types/analysis_helper.dart b/pkg/front_end/test/static_types/analysis_helper.dart
index cdfdfcc..2e57c0e 100644
--- a/pkg/front_end/test/static_types/analysis_helper.dart
+++ b/pkg/front_end/test/static_types/analysis_helper.dart
@@ -210,7 +210,7 @@
             // add ' (allowed)' to an existing message!
             LocatedMessage locatedMessage = message.locatedMessage;
             String newMessageText =
-                '${locatedMessage.messageObject.message} (allowed)';
+                '${locatedMessage.messageObject.problemMessage} (allowed)';
             message = locatedMessage.withFormatting(
                 format(
                     new LocatedMessage(
@@ -218,8 +218,9 @@
                         locatedMessage.charOffset,
                         locatedMessage.length,
                         new Message(locatedMessage.messageObject.code,
-                            message: newMessageText,
-                            tip: locatedMessage.messageObject.tip,
+                            problemMessage: newMessageText,
+                            correctionMessage:
+                                locatedMessage.messageObject.correctionMessage,
                             arguments: locatedMessage.messageObject.arguments)),
                     Severity.warning,
                     location:
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart
new file mode 100644
index 0000000..9aad96b
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart
@@ -0,0 +1,52 @@
+// 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.
+
+abstract class Interface {
+  int get field;
+}
+
+class Class<T> implements Interface {
+  var field;
+
+  Class([this.field = 0]);
+  Class.named(this.field);
+  Class.redirectingGenerative(int field) : this(field);
+  factory Class.fact(int field) => new Class(field);
+  factory Class.redirectingFactory(int field) = Class;
+}
+
+mixin Mixin<S> {}
+
+class NamedMixinApplication<T, S> = Class<T> with Mixin<S>;
+
+abstract class AbstractNamedMixinApplication<T, S> = Class<T> with Mixin<S>;
+
+test() {
+  NamedMixinApplication.fact;
+  NamedMixinApplication.redirectingFactory;
+
+  AbstractNamedMixinApplication.new;
+  AbstractNamedMixinApplication.named;
+  AbstractNamedMixinApplication.redirectingGenerative;
+  AbstractNamedMixinApplication.fact;
+  AbstractNamedMixinApplication.redirectingFactory;
+}
+
+var f1 = NamedMixinApplication.new;
+var f2 = NamedMixinApplication.named;
+var f3 = NamedMixinApplication.redirectingGenerative;
+
+main() {
+  var f1 = NamedMixinApplication.new;
+  var f2 = NamedMixinApplication.named;
+  var f3 = NamedMixinApplication.redirectingGenerative;
+
+  NamedMixinApplication<int, String>.new;
+  NamedMixinApplication<int, String>.named;
+  NamedMixinApplication<int, String>.redirectingGenerative;
+
+  NamedMixinApplication<int, String> Function([int]) n1 = f1<int, String>;
+  NamedMixinApplication<int, String> Function(int) n2 = f2<int, String>;
+  NamedMixinApplication<int, String> Function(int) n3 = f3<int, String>;
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.expect
new file mode 100644
index 0000000..168005c
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.expect
@@ -0,0 +1,145 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+//   NamedMixinApplication.fact;
+//                         ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+//   NamedMixinApplication.redirectingFactory;
+//                         ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.new;
+//                                 ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.named;
+//                                 ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.redirectingGenerative;
+//                                 ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+//   AbstractNamedMixinApplication.fact;
+//                                 ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+//   AbstractNamedMixinApplication.redirectingFactory;
+//                                 ^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  abstract get field() → core::int;
+}
+class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
+  field core::int field;
+  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
+  constructor •([core::int field = #C1]) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor named(core::int field) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor redirectingGenerative(core::int field) → self::Class<self::Class::T%>
+    : this self::Class::•(field)
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>([core::int field = #C1]) → self::Class<self::Class::_#new#tearOff::T%>
+    return new self::Class::•<self::Class::_#new#tearOff::T%>(field);
+  static method _#named#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#named#tearOff::T%>
+    return new self::Class::named<self::Class::_#named#tearOff::T%>(field);
+  static method _#redirectingGenerative#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#redirectingGenerative#tearOff::T%>
+    return new self::Class::redirectingGenerative<self::Class::_#redirectingGenerative#tearOff::T%>(field);
+  static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
+    return new self::Class::•<self::Class::fact::T%>(field);
+  static method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
+    return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+    return new self::Class::•<self::Class::redirectingFactory::T%>(field);
+  static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C1) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
+    return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(field);
+}
+abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::NamedMixinApplication::T%> with self::Mixin<self::NamedMixinApplication::S%> {
+  synthetic constructor •([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int field]) → self::NamedMixinApplication<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>
+    return new self::NamedMixinApplication::•<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>(field);
+  static method _#named#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>
+    return new self::NamedMixinApplication::named<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>(field);
+  static method _#redirectingGenerative#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>
+    return new self::NamedMixinApplication::redirectingGenerative<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>(field);
+}
+abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::AbstractNamedMixinApplication::T%> with self::Mixin<self::AbstractNamedMixinApplication::S%> {
+  synthetic constructor •([core::int field = #C1]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+  NamedMixinApplication.fact;
+                        ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+  NamedMixinApplication.redirectingFactory;
+                        ^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.new;
+                                ^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.named;
+                                ^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.redirectingGenerative;
+                                ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+  AbstractNamedMixinApplication.fact;
+                                ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+  AbstractNamedMixinApplication.redirectingFactory;
+                                ^^^^^^^^^^^^^^^^^^";
+}
+static method main() → dynamic {
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+  #C5;
+  #C6;
+  #C7;
+  ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
+}
+
+constants  {
+  #C1 = 0
+  #C2 = static-tearoff self::NamedMixinApplication::_#new#tearOff
+  #C3 = static-tearoff self::NamedMixinApplication::_#named#tearOff
+  #C4 = static-tearoff self::NamedMixinApplication::_#redirectingGenerative#tearOff
+  #C5 = instantiation self::NamedMixinApplication::_#new#tearOff <core::int, core::String>
+  #C6 = instantiation self::NamedMixinApplication::_#named#tearOff <core::int, core::String>
+  #C7 = instantiation self::NamedMixinApplication::_#redirectingGenerative#tearOff <core::int, core::String>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.transformed.expect
new file mode 100644
index 0000000..3d96732
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.strong.transformed.expect
@@ -0,0 +1,145 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+//   NamedMixinApplication.fact;
+//                         ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+//   NamedMixinApplication.redirectingFactory;
+//                         ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.new;
+//                                 ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.named;
+//                                 ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.redirectingGenerative;
+//                                 ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+//   AbstractNamedMixinApplication.fact;
+//                                 ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+//   AbstractNamedMixinApplication.redirectingFactory;
+//                                 ^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  abstract get field() → core::int;
+}
+class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
+  field core::int field;
+  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
+  constructor •([core::int field = #C1]) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor named(core::int field) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor redirectingGenerative(core::int field) → self::Class<self::Class::T%>
+    : this self::Class::•(field)
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>([core::int field = #C1]) → self::Class<self::Class::_#new#tearOff::T%>
+    return new self::Class::•<self::Class::_#new#tearOff::T%>(field);
+  static method _#named#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#named#tearOff::T%>
+    return new self::Class::named<self::Class::_#named#tearOff::T%>(field);
+  static method _#redirectingGenerative#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#redirectingGenerative#tearOff::T%>
+    return new self::Class::redirectingGenerative<self::Class::_#redirectingGenerative#tearOff::T%>(field);
+  static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
+    return new self::Class::•<self::Class::fact::T%>(field);
+  static method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
+    return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+    return new self::Class::•<self::Class::redirectingFactory::T%>(field);
+  static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C1) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
+    return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(field);
+}
+abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> extends self::Class<self::NamedMixinApplication::T%> implements self::Mixin<self::NamedMixinApplication::S%> /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int field]) → self::NamedMixinApplication<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>
+    return new self::NamedMixinApplication::•<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>(field);
+  static method _#named#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>
+    return new self::NamedMixinApplication::named<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>(field);
+  static method _#redirectingGenerative#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>
+    return new self::NamedMixinApplication::redirectingGenerative<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>(field);
+}
+abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> extends self::Class<self::AbstractNamedMixinApplication::T%> implements self::Mixin<self::AbstractNamedMixinApplication::S%> /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int field = #C1]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+  NamedMixinApplication.fact;
+                        ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+  NamedMixinApplication.redirectingFactory;
+                        ^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.new;
+                                ^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.named;
+                                ^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.redirectingGenerative;
+                                ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+  AbstractNamedMixinApplication.fact;
+                                ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+  AbstractNamedMixinApplication.redirectingFactory;
+                                ^^^^^^^^^^^^^^^^^^";
+}
+static method main() → dynamic {
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+  #C5;
+  #C6;
+  #C7;
+  ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
+}
+
+constants  {
+  #C1 = 0
+  #C2 = static-tearoff self::NamedMixinApplication::_#new#tearOff
+  #C3 = static-tearoff self::NamedMixinApplication::_#named#tearOff
+  #C4 = static-tearoff self::NamedMixinApplication::_#redirectingGenerative#tearOff
+  #C5 = instantiation self::NamedMixinApplication::_#new#tearOff <core::int, core::String>
+  #C6 = instantiation self::NamedMixinApplication::_#named#tearOff <core::int, core::String>
+  #C7 = instantiation self::NamedMixinApplication::_#redirectingGenerative#tearOff <core::int, core::String>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.textual_outline.expect
new file mode 100644
index 0000000..e762d95
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.textual_outline.expect
@@ -0,0 +1,21 @@
+abstract class Interface {
+  int get field;
+}
+
+class Class<T> implements Interface {
+  var field;
+  Class([this.field = 0]);
+  Class.named(this.field);
+  Class.redirectingGenerative(int field) : this(field);
+  factory Class.fact(int field) => new Class(field);
+  factory Class.redirectingFactory(int field) = Class;
+}
+
+mixin Mixin<S> {}
+class NamedMixinApplication<T, S> = Class<T> with Mixin<S>;
+abstract class AbstractNamedMixinApplication<T, S> = Class<T> with Mixin<S>;
+test() {}
+var f1 = NamedMixinApplication.new;
+var f2 = NamedMixinApplication.named;
+var f3 = NamedMixinApplication.redirectingGenerative;
+main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..e4743e7
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.textual_outline_modelled.expect
@@ -0,0 +1,22 @@
+abstract class AbstractNamedMixinApplication<T, S> = Class<T> with Mixin<S>;
+
+abstract class Interface {
+  int get field;
+}
+
+class Class<T> implements Interface {
+  Class([this.field = 0]);
+  Class.named(this.field);
+  Class.redirectingGenerative(int field) : this(field);
+  factory Class.fact(int field) => new Class(field);
+  factory Class.redirectingFactory(int field) = Class;
+  var field;
+}
+
+class NamedMixinApplication<T, S> = Class<T> with Mixin<S>;
+main() {}
+mixin Mixin<S> {}
+test() {}
+var f1 = NamedMixinApplication.new;
+var f2 = NamedMixinApplication.named;
+var f3 = NamedMixinApplication.redirectingGenerative;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.expect
new file mode 100644
index 0000000..54437d8
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.expect
@@ -0,0 +1,145 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+//   NamedMixinApplication.fact;
+//                         ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+//   NamedMixinApplication.redirectingFactory;
+//                         ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.new;
+//                                 ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.named;
+//                                 ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.redirectingGenerative;
+//                                 ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+//   AbstractNamedMixinApplication.fact;
+//                                 ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+//   AbstractNamedMixinApplication.redirectingFactory;
+//                                 ^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  abstract get field() → core::int;
+}
+class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
+  field core::int field;
+  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
+  constructor •([core::int field = #C1]) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor named(core::int field) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor redirectingGenerative(core::int field) → self::Class<self::Class::T%>
+    : this self::Class::•(field)
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>([core::int field = #C1]) → self::Class<self::Class::_#new#tearOff::T%>
+    return new self::Class::•<self::Class::_#new#tearOff::T%>(field);
+  static method _#named#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#named#tearOff::T%>
+    return new self::Class::named<self::Class::_#named#tearOff::T%>(field);
+  static method _#redirectingGenerative#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#redirectingGenerative#tearOff::T%>
+    return new self::Class::redirectingGenerative<self::Class::_#redirectingGenerative#tearOff::T%>(field);
+  static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
+    return new self::Class::•<self::Class::fact::T%>(field);
+  static method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
+    return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+    return new self::Class::•<self::Class::redirectingFactory::T%>(field);
+  static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C1) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
+    return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(field);
+}
+abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::NamedMixinApplication::T%> with self::Mixin<self::NamedMixinApplication::S%> {
+  synthetic constructor •([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int field]) → self::NamedMixinApplication<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>
+    return new self::NamedMixinApplication::•<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>(field);
+  static method _#named#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>
+    return new self::NamedMixinApplication::named<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>(field);
+  static method _#redirectingGenerative#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>
+    return new self::NamedMixinApplication::redirectingGenerative<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>(field);
+}
+abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::AbstractNamedMixinApplication::T%> with self::Mixin<self::AbstractNamedMixinApplication::S%> {
+  synthetic constructor •([core::int field = #C1]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+  NamedMixinApplication.fact;
+                        ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+  NamedMixinApplication.redirectingFactory;
+                        ^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.new;
+                                ^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.named;
+                                ^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.redirectingGenerative;
+                                ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+  AbstractNamedMixinApplication.fact;
+                                ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+  AbstractNamedMixinApplication.redirectingFactory;
+                                ^^^^^^^^^^^^^^^^^^";
+}
+static method main() → dynamic {
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+  #C5;
+  #C6;
+  #C7;
+  ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
+}
+
+constants  {
+  #C1 = 0
+  #C2 = static-tearoff self::NamedMixinApplication::_#new#tearOff
+  #C3 = static-tearoff self::NamedMixinApplication::_#named#tearOff
+  #C4 = static-tearoff self::NamedMixinApplication::_#redirectingGenerative#tearOff
+  #C5 = instantiation self::NamedMixinApplication::_#new#tearOff <core::int*, core::String*>
+  #C6 = instantiation self::NamedMixinApplication::_#named#tearOff <core::int*, core::String*>
+  #C7 = instantiation self::NamedMixinApplication::_#redirectingGenerative#tearOff <core::int*, core::String*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect
new file mode 100644
index 0000000..fbdc213
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.outline.expect
@@ -0,0 +1,70 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    ;
+  abstract get field() → core::int;
+}
+class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
+  field core::int field;
+  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
+  constructor •([core::int field]) → self::Class<self::Class::T%>
+    ;
+  constructor named(core::int field) → self::Class<self::Class::T%>
+    ;
+  constructor redirectingGenerative(core::int field) → self::Class<self::Class::T%>
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>([core::int field]) → self::Class<self::Class::_#new#tearOff::T%>
+    return new self::Class::•<self::Class::_#new#tearOff::T%>(field);
+  static method _#named#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#named#tearOff::T%>
+    return new self::Class::named<self::Class::_#named#tearOff::T%>(field);
+  static method _#redirectingGenerative#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#redirectingGenerative#tearOff::T%>
+    return new self::Class::redirectingGenerative<self::Class::_#redirectingGenerative#tearOff::T%>(field);
+  static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
+    ;
+  static method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
+    return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+    return new self::Class::•<self::Class::redirectingFactory::T%>(field);
+  static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
+    return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(field);
+}
+abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::NamedMixinApplication::T%> with self::Mixin<self::NamedMixinApplication::S%> {
+  synthetic constructor •([core::int field]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int field]) → self::NamedMixinApplication<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>
+    return new self::NamedMixinApplication::•<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>(field);
+  static method _#named#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>
+    return new self::NamedMixinApplication::named<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>(field);
+  static method _#redirectingGenerative#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>
+    return new self::NamedMixinApplication::redirectingGenerative<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>(field);
+}
+abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::AbstractNamedMixinApplication::T%> with self::Mixin<self::AbstractNamedMixinApplication::S%> {
+  synthetic constructor •([core::int field]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.transformed.expect
new file mode 100644
index 0000000..9786626
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart.weak.transformed.expect
@@ -0,0 +1,145 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+//   NamedMixinApplication.fact;
+//                         ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+//   NamedMixinApplication.redirectingFactory;
+//                         ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.new;
+//                                 ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.named;
+//                                 ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.redirectingGenerative;
+//                                 ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+//   AbstractNamedMixinApplication.fact;
+//                                 ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+//   AbstractNamedMixinApplication.redirectingFactory;
+//                                 ^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  abstract get field() → core::int;
+}
+class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
+  field core::int field;
+  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
+  constructor •([core::int field = #C1]) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor named(core::int field) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor redirectingGenerative(core::int field) → self::Class<self::Class::T%>
+    : this self::Class::•(field)
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic>([core::int field = #C1]) → self::Class<self::Class::_#new#tearOff::T%>
+    return new self::Class::•<self::Class::_#new#tearOff::T%>(field);
+  static method _#named#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#named#tearOff::T%>
+    return new self::Class::named<self::Class::_#named#tearOff::T%>(field);
+  static method _#redirectingGenerative#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#redirectingGenerative#tearOff::T%>
+    return new self::Class::redirectingGenerative<self::Class::_#redirectingGenerative#tearOff::T%>(field);
+  static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
+    return new self::Class::•<self::Class::fact::T%>(field);
+  static method _#fact#tearOff<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::_#fact#tearOff::T%>
+    return self::Class::fact<self::Class::_#fact#tearOff::T%>(field);
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+    return new self::Class::•<self::Class::redirectingFactory::T%>(field);
+  static method _#redirectingFactory#tearOff<T extends core::Object? = dynamic>(core::int field = #C1) → self::Class<self::Class::_#redirectingFactory#tearOff::T%>
+    return new self::Class::•<self::Class::_#redirectingFactory#tearOff::T%>(field);
+}
+abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> extends self::Class<self::NamedMixinApplication::T%> implements self::Mixin<self::NamedMixinApplication::S%> /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+  static method _#new#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int field]) → self::NamedMixinApplication<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>
+    return new self::NamedMixinApplication::•<self::NamedMixinApplication::_#new#tearOff::T%, self::NamedMixinApplication::_#new#tearOff::S%>(field);
+  static method _#named#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>
+    return new self::NamedMixinApplication::named<self::NamedMixinApplication::_#named#tearOff::T%, self::NamedMixinApplication::_#named#tearOff::S%>(field);
+  static method _#redirectingGenerative#tearOff<T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>
+    return new self::NamedMixinApplication::redirectingGenerative<self::NamedMixinApplication::_#redirectingGenerative#tearOff::T%, self::NamedMixinApplication::_#redirectingGenerative#tearOff::S%>(field);
+}
+abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> extends self::Class<self::AbstractNamedMixinApplication::T%> implements self::Mixin<self::AbstractNamedMixinApplication::S%> /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int field = #C1]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+  NamedMixinApplication.fact;
+                        ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+  NamedMixinApplication.redirectingFactory;
+                        ^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.new;
+                                ^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.named;
+                                ^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.redirectingGenerative;
+                                ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+  AbstractNamedMixinApplication.fact;
+                                ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/lowering/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+  AbstractNamedMixinApplication.redirectingFactory;
+                                ^^^^^^^^^^^^^^^^^^";
+}
+static method main() → dynamic {
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+  #C5;
+  #C6;
+  #C7;
+  ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
+}
+
+constants  {
+  #C1 = 0
+  #C2 = static-tearoff self::NamedMixinApplication::_#new#tearOff
+  #C3 = static-tearoff self::NamedMixinApplication::_#named#tearOff
+  #C4 = static-tearoff self::NamedMixinApplication::_#redirectingGenerative#tearOff
+  #C5 = instantiation self::NamedMixinApplication::_#new#tearOff <core::int*, core::String*>
+  #C6 = instantiation self::NamedMixinApplication::_#named#tearOff <core::int*, core::String*>
+  #C7 = instantiation self::NamedMixinApplication::_#redirectingGenerative#tearOff <core::int*, core::String*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart
new file mode 100644
index 0000000..9aad96b
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart
@@ -0,0 +1,52 @@
+// 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.
+
+abstract class Interface {
+  int get field;
+}
+
+class Class<T> implements Interface {
+  var field;
+
+  Class([this.field = 0]);
+  Class.named(this.field);
+  Class.redirectingGenerative(int field) : this(field);
+  factory Class.fact(int field) => new Class(field);
+  factory Class.redirectingFactory(int field) = Class;
+}
+
+mixin Mixin<S> {}
+
+class NamedMixinApplication<T, S> = Class<T> with Mixin<S>;
+
+abstract class AbstractNamedMixinApplication<T, S> = Class<T> with Mixin<S>;
+
+test() {
+  NamedMixinApplication.fact;
+  NamedMixinApplication.redirectingFactory;
+
+  AbstractNamedMixinApplication.new;
+  AbstractNamedMixinApplication.named;
+  AbstractNamedMixinApplication.redirectingGenerative;
+  AbstractNamedMixinApplication.fact;
+  AbstractNamedMixinApplication.redirectingFactory;
+}
+
+var f1 = NamedMixinApplication.new;
+var f2 = NamedMixinApplication.named;
+var f3 = NamedMixinApplication.redirectingGenerative;
+
+main() {
+  var f1 = NamedMixinApplication.new;
+  var f2 = NamedMixinApplication.named;
+  var f3 = NamedMixinApplication.redirectingGenerative;
+
+  NamedMixinApplication<int, String>.new;
+  NamedMixinApplication<int, String>.named;
+  NamedMixinApplication<int, String>.redirectingGenerative;
+
+  NamedMixinApplication<int, String> Function([int]) n1 = f1<int, String>;
+  NamedMixinApplication<int, String> Function(int) n2 = f2<int, String>;
+  NamedMixinApplication<int, String> Function(int) n3 = f3<int, String>;
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.expect
new file mode 100644
index 0000000..47537c5
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.expect
@@ -0,0 +1,129 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+//   NamedMixinApplication.fact;
+//                         ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+//   NamedMixinApplication.redirectingFactory;
+//                         ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.new;
+//                                 ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.named;
+//                                 ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.redirectingGenerative;
+//                                 ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+//   AbstractNamedMixinApplication.fact;
+//                                 ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+//   AbstractNamedMixinApplication.redirectingFactory;
+//                                 ^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  abstract get field() → core::int;
+}
+class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
+  field core::int field;
+  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
+  constructor •([core::int field = #C1]) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor named(core::int field) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor redirectingGenerative(core::int field) → self::Class<self::Class::T%>
+    : this self::Class::•(field)
+    ;
+  static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
+    return new self::Class::•<self::Class::fact::T%>(field);
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+    return new self::Class::•<self::Class::redirectingFactory::T%>(field);
+}
+abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::NamedMixinApplication::T%> with self::Mixin<self::NamedMixinApplication::S%> {
+  synthetic constructor •([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::AbstractNamedMixinApplication::T%> with self::Mixin<self::AbstractNamedMixinApplication::S%> {
+  synthetic constructor •([core::int field = #C1]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+  NamedMixinApplication.fact;
+                        ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+  NamedMixinApplication.redirectingFactory;
+                        ^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.new;
+                                ^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.named;
+                                ^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.redirectingGenerative;
+                                ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+  AbstractNamedMixinApplication.fact;
+                                ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+  AbstractNamedMixinApplication.redirectingFactory;
+                                ^^^^^^^^^^^^^^^^^^";
+}
+static method main() → dynamic {
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+  #C5;
+  #C6;
+  #C7;
+  ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
+}
+
+constants  {
+  #C1 = 0
+  #C2 = constructor-tearoff self::NamedMixinApplication::•
+  #C3 = constructor-tearoff self::NamedMixinApplication::named
+  #C4 = constructor-tearoff self::NamedMixinApplication::redirectingGenerative
+  #C5 = instantiation self::NamedMixinApplication::• <core::int, core::String>
+  #C6 = instantiation self::NamedMixinApplication::named <core::int, core::String>
+  #C7 = instantiation self::NamedMixinApplication::redirectingGenerative <core::int, core::String>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.transformed.expect
new file mode 100644
index 0000000..6e9a6ef
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.strong.transformed.expect
@@ -0,0 +1,129 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+//   NamedMixinApplication.fact;
+//                         ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+//   NamedMixinApplication.redirectingFactory;
+//                         ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.new;
+//                                 ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.named;
+//                                 ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.redirectingGenerative;
+//                                 ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+//   AbstractNamedMixinApplication.fact;
+//                                 ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+//   AbstractNamedMixinApplication.redirectingFactory;
+//                                 ^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  abstract get field() → core::int;
+}
+class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
+  field core::int field;
+  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
+  constructor •([core::int field = #C1]) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor named(core::int field) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor redirectingGenerative(core::int field) → self::Class<self::Class::T%>
+    : this self::Class::•(field)
+    ;
+  static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
+    return new self::Class::•<self::Class::fact::T%>(field);
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+    return new self::Class::•<self::Class::redirectingFactory::T%>(field);
+}
+abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> extends self::Class<self::NamedMixinApplication::T%> implements self::Mixin<self::NamedMixinApplication::S%> /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> extends self::Class<self::AbstractNamedMixinApplication::T%> implements self::Mixin<self::AbstractNamedMixinApplication::S%> /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int field = #C1]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+  NamedMixinApplication.fact;
+                        ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+  NamedMixinApplication.redirectingFactory;
+                        ^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.new;
+                                ^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.named;
+                                ^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.redirectingGenerative;
+                                ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+  AbstractNamedMixinApplication.fact;
+                                ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+  AbstractNamedMixinApplication.redirectingFactory;
+                                ^^^^^^^^^^^^^^^^^^";
+}
+static method main() → dynamic {
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+  #C5;
+  #C6;
+  #C7;
+  ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
+}
+
+constants  {
+  #C1 = 0
+  #C2 = constructor-tearoff self::NamedMixinApplication::•
+  #C3 = constructor-tearoff self::NamedMixinApplication::named
+  #C4 = constructor-tearoff self::NamedMixinApplication::redirectingGenerative
+  #C5 = instantiation self::NamedMixinApplication::• <core::int, core::String>
+  #C6 = instantiation self::NamedMixinApplication::named <core::int, core::String>
+  #C7 = instantiation self::NamedMixinApplication::redirectingGenerative <core::int, core::String>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.textual_outline.expect
new file mode 100644
index 0000000..e762d95
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.textual_outline.expect
@@ -0,0 +1,21 @@
+abstract class Interface {
+  int get field;
+}
+
+class Class<T> implements Interface {
+  var field;
+  Class([this.field = 0]);
+  Class.named(this.field);
+  Class.redirectingGenerative(int field) : this(field);
+  factory Class.fact(int field) => new Class(field);
+  factory Class.redirectingFactory(int field) = Class;
+}
+
+mixin Mixin<S> {}
+class NamedMixinApplication<T, S> = Class<T> with Mixin<S>;
+abstract class AbstractNamedMixinApplication<T, S> = Class<T> with Mixin<S>;
+test() {}
+var f1 = NamedMixinApplication.new;
+var f2 = NamedMixinApplication.named;
+var f3 = NamedMixinApplication.redirectingGenerative;
+main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..e4743e7
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.textual_outline_modelled.expect
@@ -0,0 +1,22 @@
+abstract class AbstractNamedMixinApplication<T, S> = Class<T> with Mixin<S>;
+
+abstract class Interface {
+  int get field;
+}
+
+class Class<T> implements Interface {
+  Class([this.field = 0]);
+  Class.named(this.field);
+  Class.redirectingGenerative(int field) : this(field);
+  factory Class.fact(int field) => new Class(field);
+  factory Class.redirectingFactory(int field) = Class;
+  var field;
+}
+
+class NamedMixinApplication<T, S> = Class<T> with Mixin<S>;
+main() {}
+mixin Mixin<S> {}
+test() {}
+var f1 = NamedMixinApplication.new;
+var f2 = NamedMixinApplication.named;
+var f3 = NamedMixinApplication.redirectingGenerative;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.expect
new file mode 100644
index 0000000..7db9ced
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.expect
@@ -0,0 +1,129 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+//   NamedMixinApplication.fact;
+//                         ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+//   NamedMixinApplication.redirectingFactory;
+//                         ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.new;
+//                                 ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.named;
+//                                 ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.redirectingGenerative;
+//                                 ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+//   AbstractNamedMixinApplication.fact;
+//                                 ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+//   AbstractNamedMixinApplication.redirectingFactory;
+//                                 ^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  abstract get field() → core::int;
+}
+class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
+  field core::int field;
+  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
+  constructor •([core::int field = #C1]) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor named(core::int field) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor redirectingGenerative(core::int field) → self::Class<self::Class::T%>
+    : this self::Class::•(field)
+    ;
+  static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
+    return new self::Class::•<self::Class::fact::T%>(field);
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+    return new self::Class::•<self::Class::redirectingFactory::T%>(field);
+}
+abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::NamedMixinApplication::T%> with self::Mixin<self::NamedMixinApplication::S%> {
+  synthetic constructor •([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::AbstractNamedMixinApplication::T%> with self::Mixin<self::AbstractNamedMixinApplication::S%> {
+  synthetic constructor •([core::int field = #C1]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+  NamedMixinApplication.fact;
+                        ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+  NamedMixinApplication.redirectingFactory;
+                        ^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.new;
+                                ^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.named;
+                                ^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.redirectingGenerative;
+                                ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+  AbstractNamedMixinApplication.fact;
+                                ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+  AbstractNamedMixinApplication.redirectingFactory;
+                                ^^^^^^^^^^^^^^^^^^";
+}
+static method main() → dynamic {
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+  #C5;
+  #C6;
+  #C7;
+  ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
+}
+
+constants  {
+  #C1 = 0
+  #C2 = constructor-tearoff self::NamedMixinApplication::•
+  #C3 = constructor-tearoff self::NamedMixinApplication::named
+  #C4 = constructor-tearoff self::NamedMixinApplication::redirectingGenerative
+  #C5 = instantiation self::NamedMixinApplication::• <core::int*, core::String*>
+  #C6 = instantiation self::NamedMixinApplication::named <core::int*, core::String*>
+  #C7 = instantiation self::NamedMixinApplication::redirectingGenerative <core::int*, core::String*>
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect
new file mode 100644
index 0000000..74af4ae
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.outline.expect
@@ -0,0 +1,54 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    ;
+  abstract get field() → core::int;
+}
+class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
+  field core::int field;
+  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
+  constructor •([core::int field]) → self::Class<self::Class::T%>
+    ;
+  constructor named(core::int field) → self::Class<self::Class::T%>
+    ;
+  constructor redirectingGenerative(core::int field) → self::Class<self::Class::T%>
+    ;
+  static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
+    ;
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+    return new self::Class::•<self::Class::redirectingFactory::T%>(field);
+}
+abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::NamedMixinApplication::T%> with self::Mixin<self::NamedMixinApplication::S%> {
+  synthetic constructor •([core::int field]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> = self::Class<self::AbstractNamedMixinApplication::T%> with self::Mixin<self::AbstractNamedMixinApplication::S%> {
+  synthetic constructor •([core::int field]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.transformed.expect
new file mode 100644
index 0000000..9b266ff
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart.weak.transformed.expect
@@ -0,0 +1,129 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+//   NamedMixinApplication.fact;
+//                         ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+//   NamedMixinApplication.redirectingFactory;
+//                         ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.new;
+//                                 ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.named;
+//                                 ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+//   AbstractNamedMixinApplication.redirectingGenerative;
+//                                 ^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+//   AbstractNamedMixinApplication.fact;
+//                                 ^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+//   AbstractNamedMixinApplication.redirectingFactory;
+//                                 ^^^^^^^^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+abstract class Interface extends core::Object {
+  synthetic constructor •() → self::Interface
+    : super core::Object::•()
+    ;
+  abstract get field() → core::int;
+}
+class Class<T extends core::Object? = dynamic> extends core::Object implements self::Interface {
+  field core::int field;
+  static final field dynamic _redirecting# = <dynamic>[self::Class::redirectingFactory]/*isLegacy*/;
+  constructor •([core::int field = #C1]) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor named(core::int field) → self::Class<self::Class::T%>
+    : self::Class::field = field, super core::Object::•()
+    ;
+  constructor redirectingGenerative(core::int field) → self::Class<self::Class::T%>
+    : this self::Class::•(field)
+    ;
+  static factory fact<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::fact::T%>
+    return new self::Class::•<self::Class::fact::T%>(field);
+  static factory redirectingFactory<T extends core::Object? = dynamic>(core::int field) → self::Class<self::Class::redirectingFactory::T%>
+    return new self::Class::•<self::Class::redirectingFactory::T%>(field);
+}
+abstract class Mixin<S extends core::Object? = dynamic> extends core::Object /*isMixinDeclaration*/  {
+}
+class NamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> extends self::Class<self::NamedMixinApplication::T%> implements self::Mixin<self::NamedMixinApplication::S%> /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int field = #C1]) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::NamedMixinApplication<self::NamedMixinApplication::T%, self::NamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+abstract class AbstractNamedMixinApplication<T extends core::Object? = dynamic, S extends core::Object? = dynamic> extends self::Class<self::AbstractNamedMixinApplication::T%> implements self::Mixin<self::AbstractNamedMixinApplication::S%> /*isEliminatedMixin*/  {
+  synthetic constructor •([core::int field = #C1]) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::•(field)
+    ;
+  synthetic constructor named(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::named(field)
+    ;
+  synthetic constructor redirectingGenerative(core::int field) → self::AbstractNamedMixinApplication<self::AbstractNamedMixinApplication::T%, self::AbstractNamedMixinApplication::S%>
+    : super self::Class::redirectingGenerative(field)
+    ;
+}
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
+static field <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:26:25: Error: Member not found: 'fact'.
+  NamedMixinApplication.fact;
+                        ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:27:25: Error: Member not found: 'redirectingFactory'.
+  NamedMixinApplication.redirectingFactory;
+                        ^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:29:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.new;
+                                ^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:30:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.named;
+                                ^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:31:33: Error: Constructors on abstract classes can't be torn off.
+  AbstractNamedMixinApplication.redirectingGenerative;
+                                ^^^^^^^^^^^^^^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:32:33: Error: Member not found: 'fact'.
+  AbstractNamedMixinApplication.fact;
+                                ^^^^";
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/named_mixin_application.dart:33:33: Error: Member not found: 'redirectingFactory'.
+  AbstractNamedMixinApplication.redirectingFactory;
+                                ^^^^^^^^^^^^^^^^^^";
+}
+static method main() → dynamic {
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>([core::int]) → self::NamedMixinApplication<T%, S%> f1 = #C2;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f2 = #C3;
+  <T extends core::Object? = dynamic, S extends core::Object? = dynamic>(core::int) → self::NamedMixinApplication<T%, S%> f3 = #C4;
+  #C5;
+  #C6;
+  #C7;
+  ([core::int]) → self::NamedMixinApplication<core::int, core::String> n1 = f1<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n2 = f2<core::int, core::String>;
+  (core::int) → self::NamedMixinApplication<core::int, core::String> n3 = f3<core::int, core::String>;
+}
+
+constants  {
+  #C1 = 0
+  #C2 = constructor-tearoff self::NamedMixinApplication::•
+  #C3 = constructor-tearoff self::NamedMixinApplication::named
+  #C4 = constructor-tearoff self::NamedMixinApplication::redirectingGenerative
+  #C5 = instantiation self::NamedMixinApplication::• <core::int*, core::String*>
+  #C6 = instantiation self::NamedMixinApplication::named <core::int*, core::String*>
+  #C7 = instantiation self::NamedMixinApplication::redirectingGenerative <core::int*, core::String*>
+}
diff --git a/pkg/front_end/testcases/dartdevc/issue47313.dart b/pkg/front_end/testcases/dartdevc/issue47313.dart
new file mode 100644
index 0000000..e2eaf1e
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue47313.dart
@@ -0,0 +1,13 @@
+// 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.
+
+class A<X> {}
+
+mixin M {}
+
+class C<X> = A<X> with M;
+
+main() {
+  C.new;
+}
diff --git a/pkg/front_end/testcases/dartdevc/issue47313.dart.strong.expect b/pkg/front_end/testcases/dartdevc/issue47313.dart.strong.expect
new file mode 100644
index 0000000..26cc49c
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue47313.dart.strong.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<X extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::X%>
+    return new self::A::•<self::A::_#new#tearOff::X%>();
+}
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+class C<X extends core::Object? = dynamic> = self::A<self::C::X%> with self::M {
+  synthetic constructor •() → self::C<self::C::X%>
+    : super self::A::•()
+    ;
+  static method _#new#tearOff<X extends core::Object? = dynamic>() → self::C<self::C::_#new#tearOff::X%>
+    return new self::C::•<self::C::_#new#tearOff::X%>();
+}
+static method main() → dynamic {
+  #C1;
+}
+
+constants  {
+  #C1 = static-tearoff self::C::_#new#tearOff
+}
diff --git a/pkg/front_end/testcases/dartdevc/issue47313.dart.strong.transformed.expect b/pkg/front_end/testcases/dartdevc/issue47313.dart.strong.transformed.expect
new file mode 100644
index 0000000..26cc49c
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue47313.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<X extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::X%>
+    return new self::A::•<self::A::_#new#tearOff::X%>();
+}
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+class C<X extends core::Object? = dynamic> = self::A<self::C::X%> with self::M {
+  synthetic constructor •() → self::C<self::C::X%>
+    : super self::A::•()
+    ;
+  static method _#new#tearOff<X extends core::Object? = dynamic>() → self::C<self::C::_#new#tearOff::X%>
+    return new self::C::•<self::C::_#new#tearOff::X%>();
+}
+static method main() → dynamic {
+  #C1;
+}
+
+constants  {
+  #C1 = static-tearoff self::C::_#new#tearOff
+}
diff --git a/pkg/front_end/testcases/dartdevc/issue47313.dart.textual_outline.expect b/pkg/front_end/testcases/dartdevc/issue47313.dart.textual_outline.expect
new file mode 100644
index 0000000..844e733
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue47313.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+class A<X> {}
+
+mixin M {}
+class C<X> = A<X> with M;
+main() {}
diff --git a/pkg/front_end/testcases/dartdevc/issue47313.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dartdevc/issue47313.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..acd5db2
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue47313.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+class A<X> {}
+
+class C<X> = A<X> with M;
+main() {}
+mixin M {}
diff --git a/pkg/front_end/testcases/dartdevc/issue47313.dart.weak.expect b/pkg/front_end/testcases/dartdevc/issue47313.dart.weak.expect
new file mode 100644
index 0000000..26cc49c
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue47313.dart.weak.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<X extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::X%>
+    return new self::A::•<self::A::_#new#tearOff::X%>();
+}
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+class C<X extends core::Object? = dynamic> = self::A<self::C::X%> with self::M {
+  synthetic constructor •() → self::C<self::C::X%>
+    : super self::A::•()
+    ;
+  static method _#new#tearOff<X extends core::Object? = dynamic>() → self::C<self::C::_#new#tearOff::X%>
+    return new self::C::•<self::C::_#new#tearOff::X%>();
+}
+static method main() → dynamic {
+  #C1;
+}
+
+constants  {
+  #C1 = static-tearoff self::C::_#new#tearOff
+}
diff --git a/pkg/front_end/testcases/dartdevc/issue47313.dart.weak.outline.expect b/pkg/front_end/testcases/dartdevc/issue47313.dart.weak.outline.expect
new file mode 100644
index 0000000..f206219
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue47313.dart.weak.outline.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    ;
+  static method _#new#tearOff<X extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::X%>
+    return new self::A::•<self::A::_#new#tearOff::X%>();
+}
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+class C<X extends core::Object? = dynamic> = self::A<self::C::X%> with self::M {
+  synthetic constructor •() → self::C<self::C::X%>
+    : super self::A::•()
+    ;
+  static method _#new#tearOff<X extends core::Object? = dynamic>() → self::C<self::C::_#new#tearOff::X%>
+    return new self::C::•<self::C::_#new#tearOff::X%>();
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/dartdevc/issue47313.dart.weak.transformed.expect b/pkg/front_end/testcases/dartdevc/issue47313.dart.weak.transformed.expect
new file mode 100644
index 0000000..26cc49c
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/issue47313.dart.weak.transformed.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X%>
+    : super core::Object::•()
+    ;
+  static method _#new#tearOff<X extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::X%>
+    return new self::A::•<self::A::_#new#tearOff::X%>();
+}
+abstract class M extends core::Object /*isMixinDeclaration*/  {
+}
+class C<X extends core::Object? = dynamic> = self::A<self::C::X%> with self::M {
+  synthetic constructor •() → self::C<self::C::X%>
+    : super self::A::•()
+    ;
+  static method _#new#tearOff<X extends core::Object? = dynamic>() → self::C<self::C::_#new#tearOff::X%>
+    return new self::C::•<self::C::_#new#tearOff::X%>();
+}
+static method main() → dynamic {
+  #C1;
+}
+
+constants  {
+  #C1 = static-tearoff self::C::_#new#tearOff
+}
diff --git a/pkg/front_end/testcases/extensions/annotations.dart b/pkg/front_end/testcases/extensions/annotations.dart
index 8e69899..5144d09 100644
--- a/pkg/front_end/testcases/extensions/annotations.dart
+++ b/pkg/front_end/testcases/extensions/annotations.dart
@@ -1,7 +1,9 @@
 // Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+
 // @dart=2.9
+
 class Class {
   @pragma('dart2js:noInline')
   instanceMethod() {}
diff --git a/pkg/front_end/testcases/extensions/annotations.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/annotations.dart.weak.outline.expect
index 8a6129e..1ab642c 100644
--- a/pkg/front_end/testcases/extensions/annotations.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/extensions/annotations.dart.weak.outline.expect
@@ -43,9 +43,9 @@
 
 
 Extra constant evaluation status:
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:6:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:9:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:14:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:17:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:21:2 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:8:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:11:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:16:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:19:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:23:2 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
 Extra constant evaluation: evaluated: 8, effectively constant: 5
diff --git a/pkg/front_end/testcases/extensions/annotations_scope.dart b/pkg/front_end/testcases/extensions/annotations_scope.dart
new file mode 100644
index 0000000..55db07d
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/annotations_scope.dart
@@ -0,0 +1,25 @@
+// 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.
+
+// Test that extension member annotations can access other extension static
+// members from the same extension by simple name.
+
+extension E on int {
+  @constField
+  static const int constField = 1;
+
+  @constField2
+  static const int constField1 = 2;
+
+  @constField1
+  static const int constField2 = 3;
+
+  @constField
+  static void staticMethod() {}
+
+  @constField
+  void instanceMethod() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/annotations_scope.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/annotations_scope.dart.textual_outline.expect
new file mode 100644
index 0000000..1fe592b
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/annotations_scope.dart.textual_outline.expect
@@ -0,0 +1,14 @@
+extension E on int {
+  @constField
+  static const int constField = 1;
+  @constField2
+  static const int constField1 = 2;
+  @constField1
+  static const int constField2 = 3;
+  @constField
+  static void staticMethod() {}
+  @constField
+  void instanceMethod() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/annotations_scope.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/annotations_scope.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..1fe592b
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/annotations_scope.dart.textual_outline_modelled.expect
@@ -0,0 +1,14 @@
+extension E on int {
+  @constField
+  static const int constField = 1;
+  @constField2
+  static const int constField1 = 2;
+  @constField1
+  static const int constField2 = 3;
+  @constField
+  static void staticMethod() {}
+  @constField
+  void instanceMethod() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/annotations_scope.dart.weak.expect b/pkg/front_end/testcases/extensions/annotations_scope.dart.weak.expect
new file mode 100644
index 0000000..1fc63c7
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/annotations_scope.dart.weak.expect
@@ -0,0 +1,31 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension E on core::int {
+  static field constField = self::E|constField;
+  static field constField1 = self::E|constField1;
+  static field constField2 = self::E|constField2;
+  static method staticMethod = self::E|staticMethod;
+  method instanceMethod = self::E|instanceMethod;
+  tearoff instanceMethod = self::E|get#instanceMethod;
+}
+@#C1
+static const field core::int E|constField = #C1;
+@#C2
+static const field core::int E|constField1 = #C3;
+@#C3
+static const field core::int E|constField2 = #C2;
+@#C1
+static method E|staticMethod() → void {}
+@#C1
+static method E|instanceMethod(lowered final core::int #this) → void {}
+static method E|get#instanceMethod(lowered final core::int #this) → () → void
+  return () → void => self::E|instanceMethod(#this);
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = 3
+  #C3 = 2
+}
diff --git a/pkg/front_end/testcases/extensions/annotations_scope.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/annotations_scope.dart.weak.outline.expect
new file mode 100644
index 0000000..bb7bdbd
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/annotations_scope.dart.weak.outline.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension E on core::int {
+  static field constField = self::E|constField;
+  static field constField1 = self::E|constField1;
+  static field constField2 = self::E|constField2;
+  static method staticMethod = self::E|staticMethod;
+  method instanceMethod = self::E|instanceMethod;
+  tearoff instanceMethod = self::E|get#instanceMethod;
+}
+@self::E|constField
+static const field core::int E|constField = 1;
+@self::E|constField2
+static const field core::int E|constField1 = 2;
+@self::E|constField1
+static const field core::int E|constField2 = 3;
+@self::E|constField
+static method E|staticMethod() → void
+  ;
+@self::E|constField
+static method E|instanceMethod(lowered final core::int #this) → void
+  ;
+static method E|get#instanceMethod(lowered final core::int #this) → () → void
+  return () → void => self::E|instanceMethod(#this);
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///annotations_scope.dart:18:4 -> IntConstant(1)
+Evaluated: StaticGet @ org-dartlang-testcase:///annotations_scope.dart:21:4 -> IntConstant(1)
+Evaluated: StaticGet @ org-dartlang-testcase:///annotations_scope.dart:9:4 -> IntConstant(1)
+Evaluated: StaticGet @ org-dartlang-testcase:///annotations_scope.dart:12:4 -> IntConstant(3)
+Evaluated: StaticGet @ org-dartlang-testcase:///annotations_scope.dart:15:4 -> IntConstant(2)
+Extra constant evaluation: evaluated: 8, effectively constant: 5
diff --git a/pkg/front_end/testcases/extensions/annotations_scope.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/annotations_scope.dart.weak.transformed.expect
new file mode 100644
index 0000000..1fc63c7
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/annotations_scope.dart.weak.transformed.expect
@@ -0,0 +1,31 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+extension E on core::int {
+  static field constField = self::E|constField;
+  static field constField1 = self::E|constField1;
+  static field constField2 = self::E|constField2;
+  static method staticMethod = self::E|staticMethod;
+  method instanceMethod = self::E|instanceMethod;
+  tearoff instanceMethod = self::E|get#instanceMethod;
+}
+@#C1
+static const field core::int E|constField = #C1;
+@#C2
+static const field core::int E|constField1 = #C3;
+@#C3
+static const field core::int E|constField2 = #C2;
+@#C1
+static method E|staticMethod() → void {}
+@#C1
+static method E|instanceMethod(lowered final core::int #this) → void {}
+static method E|get#instanceMethod(lowered final core::int #this) → () → void
+  return () → void => self::E|instanceMethod(#this);
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = 3
+  #C3 = 2
+}
diff --git a/pkg/front_end/testcases/extensions/issue47345.dart b/pkg/front_end/testcases/extensions/issue47345.dart
new file mode 100644
index 0000000..4d8722c
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue47345.dart
@@ -0,0 +1,12 @@
+// 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.
+
+void main() {}
+
+class Foo {}
+
+extension on Foo {
+  static const bar = 1;
+  static const doubleBar = bar * 2;
+}
diff --git a/pkg/front_end/testcases/extensions/issue47345.dart.textual_outline.expect b/pkg/front_end/testcases/extensions/issue47345.dart.textual_outline.expect
new file mode 100644
index 0000000..ef181e1
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue47345.dart.textual_outline.expect
@@ -0,0 +1,8 @@
+void main() {}
+
+class Foo {}
+
+extension on Foo {
+  static const bar = 1;
+  static const doubleBar = bar * 2;
+}
diff --git a/pkg/front_end/testcases/extensions/issue47345.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/extensions/issue47345.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..0ddff5f
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue47345.dart.textual_outline_modelled.expect
@@ -0,0 +1,8 @@
+class Foo {}
+
+extension on Foo {
+  static const bar = 1;
+  static const doubleBar = bar * 2;
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/extensions/issue47345.dart.weak.expect b/pkg/front_end/testcases/extensions/issue47345.dart.weak.expect
new file mode 100644
index 0000000..38d9756
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue47345.dart.weak.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
+extension _extension#0 on self::Foo {
+  static field bar = self::_extension#0|bar;
+  static field doubleBar = self::_extension#0|doubleBar;
+}
+static const field core::int _extension#0|bar = #C1;
+static const field core::int _extension#0|doubleBar = #C2;
+static method main() → void {}
+
+constants  {
+  #C1 = 1
+  #C2 = 2
+}
diff --git a/pkg/front_end/testcases/extensions/issue47345.dart.weak.outline.expect b/pkg/front_end/testcases/extensions/issue47345.dart.weak.outline.expect
new file mode 100644
index 0000000..38ae11a
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue47345.dart.weak.outline.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    ;
+}
+extension _extension#0 on self::Foo {
+  static field bar = self::_extension#0|bar;
+  static field doubleBar = self::_extension#0|doubleBar;
+}
+static const field core::int _extension#0|bar = 1;
+static const field core::int _extension#0|doubleBar = self::_extension#0|bar.{core::num::*}(2){(core::num) → core::int};
+static method main() → void
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: InstanceInvocation @ org-dartlang-testcase:///issue47345.dart:11:32 -> IntConstant(2)
+Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/extensions/issue47345.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/issue47345.dart.weak.transformed.expect
new file mode 100644
index 0000000..38d9756
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue47345.dart.weak.transformed.expect
@@ -0,0 +1,21 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
+extension _extension#0 on self::Foo {
+  static field bar = self::_extension#0|bar;
+  static field doubleBar = self::_extension#0|doubleBar;
+}
+static const field core::int _extension#0|bar = #C1;
+static const field core::int _extension#0|doubleBar = #C2;
+static method main() → void {}
+
+constants  {
+  #C1 = 1
+  #C2 = 2
+}
diff --git a/pkg/front_end/testcases/extensions/language_issue1182.dart b/pkg/front_end/testcases/extensions/language_issue1182.dart
index 2849485..d64e302 100644
--- a/pkg/front_end/testcases/extensions/language_issue1182.dart
+++ b/pkg/front_end/testcases/extensions/language_issue1182.dart
@@ -1,7 +1,9 @@
 // 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.
+
 // @dart=2.9
+
 extension Test<T> on T {
   T Function(T) get test => (a) => this;
 }
diff --git a/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.expect b/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.expect
index 6b86f49..d952a83 100644
--- a/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.expect
+++ b/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/language_issue1182.dart:11:25: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'S Function(S)'.
+// pkg/front_end/testcases/extensions/language_issue1182.dart:13:25: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'S Function(S)'.
 //     S Function(S) f = x.test;
 //                         ^
 //
@@ -14,7 +14,7 @@
     : super core::Object::•()
     ;
   method test1(covariant-by-class self::Foo::S* x) → void {
-    (self::Foo::S*) →* self::Foo::S* f = invalid-expression "pkg/front_end/testcases/extensions/language_issue1182.dart:11:25: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'S Function(S)'.
+    (self::Foo::S*) →* self::Foo::S* f = invalid-expression "pkg/front_end/testcases/extensions/language_issue1182.dart:13:25: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'S Function(S)'.
     S Function(S) f = x.test;
                         ^" in self::Test|get#test<core::num*>(x) as{TypeError} Never;
   }
diff --git a/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.transformed.expect b/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.transformed.expect
index 6b86f49..d952a83 100644
--- a/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/extensions/language_issue1182.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/extensions/language_issue1182.dart:11:25: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'S Function(S)'.
+// pkg/front_end/testcases/extensions/language_issue1182.dart:13:25: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'S Function(S)'.
 //     S Function(S) f = x.test;
 //                         ^
 //
@@ -14,7 +14,7 @@
     : super core::Object::•()
     ;
   method test1(covariant-by-class self::Foo::S* x) → void {
-    (self::Foo::S*) →* self::Foo::S* f = invalid-expression "pkg/front_end/testcases/extensions/language_issue1182.dart:11:25: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'S Function(S)'.
+    (self::Foo::S*) →* self::Foo::S* f = invalid-expression "pkg/front_end/testcases/extensions/language_issue1182.dart:13:25: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'S Function(S)'.
     S Function(S) f = x.test;
                         ^" in self::Test|get#test<core::num*>(x) as{TypeError} Never;
   }
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 6b92aed..1bb2c89 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -6,9 +6,6 @@
 # Kernel ASTs directly, that is, code in pkg/fasta/lib/src/kernel/ with
 # strong-mode enabled.
 
-dart2js/late_statics: SemiFuzzFailure # dartbug.com/45854
-dart2js/late_from_dill/main: SemiFuzzFailure # dartbug.com/45854, see also https://dart-review.googlesource.com/c/sdk/+/213768
-
 constructor_tearoffs/call_instantiation: TypeCheckError
 constructor_tearoffs/lowering/invalid_redirect: VerificationError
 extension_types/access_setter_as_getter: ExpectationFileMismatchSerialized # Expected.
diff --git a/pkg/front_end/testcases/unscheduled_experiments/folder.options b/pkg/front_end/testcases/unscheduled_experiments/folder.options
new file mode 100644
index 0000000..b931072
--- /dev/null
+++ b/pkg/front_end/testcases/unscheduled_experiments/folder.options
@@ -0,0 +1 @@
+--enable-unscheduled-experiments
\ No newline at end of file
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart
new file mode 100644
index 0000000..2c51514
--- /dev/null
+++ b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart
@@ -0,0 +1,82 @@
+class A {
+  A(int x, int y, {required int z});
+
+  factory A.foo(int x, int y, {required int z}) => new A(x, y, z: z);
+
+  void Function(int x, int y, {required int z}) get property => throw 42;
+
+  void bar(int x, int y, {required int z}) {}
+}
+
+typedef B = A;
+
+foo(int x, int y, {required int z}) {}
+
+extension E on A {
+  method1() {
+    method2(foo: 1, 2); // This call.
+  }
+  method2(int bar, {int? foo}) {}
+}
+
+test(dynamic d, Function f, A a) {
+  void local(int x, int y, {required int z}) {}
+
+  // StaticInvocation.
+  foo(1, 2, z: 3);
+  foo(1, z: 2, 3);
+  foo(z: 1, 2, 3);
+
+  // FactoryConstructorInvocation.
+  new A.foo(1, 2, z: 3);
+  new A.foo(1, z: 2, 3);
+  new A.foo(z: 1, 2, 3);
+  new B.foo(1, 2, z: 3);
+  new B.foo(1, z: 2, 3);
+  new B.foo(z: 1, 2, 3);
+
+  // ConstructorInvocation.
+  new A(1, 2, z: 3);
+  new A(1, z: 2, 3);
+  new A(z: 1, 2, 3);
+  new B(1, 2, z: 3);
+  new B(1, z: 2, 3);
+  new B(z: 1, 2, 3);
+
+  // DynamicInvocation.
+  d(1, 2, z: 3);
+  d(1, z: 2, 3);
+  d(z: 1, 2, 3);
+
+  // FunctionInvocation.
+  f(1, 2, z: 3);
+  f(1, z: 2, 3);
+  f(z: 1, 2, 3);
+
+  // InstanceGetterInvocation.
+  a.property(1, 2, z: 3);
+  a.property(1, z: 2, 3);
+  a.property(z: 1, 2, 3);
+
+  // InstanceInvocation.
+  a.bar(1, 2, z: 3);
+  a.bar(1, z: 2, 3);
+  a.bar(z: 1, 2, 3);
+
+  // LocalFunctionInvocation.
+  local(1, 2, z: 3);
+  local(1, z: 2, 3);
+  local(z: 1, 2, 3);
+}
+
+class Test extends A {
+  Test() : super(1, 2, z: 3);
+
+  test() {
+    super.bar(1, 2, z: 3);
+    super.bar(1, z: 2, 3);
+    super.bar(z: 1, 2, 3);
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.expect b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.expect
new file mode 100644
index 0000000..c92d158
--- /dev/null
+++ b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.expect
@@ -0,0 +1,251 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:17:21: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//     method2(foo: 1, 2); // This call.
+//                     ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:27:16: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   foo(1, z: 2, 3);
+//                ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:28:13: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   foo(z: 1, 2, 3);
+//             ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:28:16: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   foo(z: 1, 2, 3);
+//                ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:32:22: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A.foo(1, z: 2, 3);
+//                      ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:33:19: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A.foo(z: 1, 2, 3);
+//                   ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:33:22: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A.foo(z: 1, 2, 3);
+//                      ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:35:22: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B.foo(1, z: 2, 3);
+//                      ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:36:19: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B.foo(z: 1, 2, 3);
+//                   ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:36:22: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B.foo(z: 1, 2, 3);
+//                      ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:40:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A(1, z: 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:41:15: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A(z: 1, 2, 3);
+//               ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:41:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A(z: 1, 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:43:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B(1, z: 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:44:15: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B(z: 1, 2, 3);
+//               ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:44:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B(z: 1, 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:48:14: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   d(1, z: 2, 3);
+//              ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:49:11: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   d(z: 1, 2, 3);
+//           ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:49:14: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   d(z: 1, 2, 3);
+//              ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:53:14: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   f(1, z: 2, 3);
+//              ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:54:11: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   f(z: 1, 2, 3);
+//           ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:54:14: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   f(z: 1, 2, 3);
+//              ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:58:23: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.property(1, z: 2, 3);
+//                       ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:59:20: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.property(z: 1, 2, 3);
+//                    ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:59:23: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.property(z: 1, 2, 3);
+//                       ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:63:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.bar(1, z: 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:64:15: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.bar(z: 1, 2, 3);
+//               ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:64:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.bar(z: 1, 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:68:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   local(1, z: 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:69:15: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   local(z: 1, 2, 3);
+//               ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:69:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   local(z: 1, 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:77:24: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//     super.bar(1, z: 2, 3);
+//                        ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:78:21: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//     super.bar(z: 1, 2, 3);
+//                     ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:78:24: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//     super.bar(z: 1, 2, 3);
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef B = self::A;
+class A extends core::Object {
+  constructor •(core::int x, core::int y, {required core::int z = #C1}) → self::A
+    : super core::Object::•()
+    ;
+  static factory foo(core::int x, core::int y, {required core::int z = #C1}) → self::A
+    return new self::A::•(x, y, z: z);
+  get property() → (core::int, core::int, {required z: core::int}) → void
+    return throw 42;
+  method bar(core::int x, core::int y, {required core::int z = #C1}) → void {}
+}
+class Test extends self::A {
+  constructor •() → self::Test
+    : super self::A::•(1, 2, z: 3)
+    ;
+  method test() → dynamic {
+    super.{self::A::bar}(1, 2, z: 3);
+    let final core::int #t1 = 1 in let final core::int #t2 = 2 in super.{self::A::bar}(#t1, 3, z: #t2);
+    let final core::int #t3 = 1 in super.{self::A::bar}(2, 3, z: #t3);
+  }
+}
+extension E on self::A {
+  method method1 = self::E|method1;
+  tearoff method1 = self::E|get#method1;
+  method method2 = self::E|method2;
+  tearoff method2 = self::E|get#method2;
+}
+static method foo(core::int x, core::int y, {required core::int z = #C1}) → dynamic {}
+static method E|method1(lowered final self::A #this) → dynamic {
+  let final self::A #t4 = #this in let final core::int #t5 = 1 in self::E|method2(#t4, 2, foo: #t5);
+}
+static method E|get#method1(lowered final self::A #this) → () → dynamic
+  return () → dynamic => self::E|method1(#this);
+static method E|method2(lowered final self::A #this, core::int bar, {core::int? foo = #C1}) → dynamic {}
+static method E|get#method2(lowered final self::A #this) → (core::int, {foo: core::int?}) → dynamic
+  return (core::int bar, {core::int? foo = #C1}) → dynamic => self::E|method2(#this, bar, foo: foo);
+static method test(dynamic d, core::Function f, self::A a) → dynamic {
+  function local(core::int x, core::int y, {required core::int z = #C1}) → void {}
+  self::foo(1, 2, z: 3);
+  let final core::int #t6 = 1 in let final core::int #t7 = 2 in self::foo(#t6, 3, z: #t7);
+  let final core::int #t8 = 1 in self::foo(2, 3, z: #t8);
+  self::A::foo(1, 2, z: 3);
+  let final core::int #t9 = 1 in let final core::int #t10 = 2 in self::A::foo(#t9, 3, z: #t10);
+  let final core::int #t11 = 1 in self::A::foo(2, 3, z: #t11);
+  self::A::foo(1, 2, z: 3);
+  let final core::int #t12 = 1 in let final core::int #t13 = 2 in self::A::foo(#t12, 3, z: #t13);
+  let final core::int #t14 = 1 in self::A::foo(2, 3, z: #t14);
+  new self::A::•(1, 2, z: 3);
+  let final core::int #t15 = 1 in let final core::int #t16 = 2 in new self::A::•(#t15, 3, z: #t16);
+  let final core::int #t17 = 1 in new self::A::•(2, 3, z: #t17);
+  new self::A::•(1, 2, z: 3);
+  let final core::int #t18 = 1 in let final core::int #t19 = 2 in new self::A::•(#t18, 3, z: #t19);
+  let final core::int #t20 = 1 in new self::A::•(2, 3, z: #t20);
+  d{dynamic}.call(1, 2, z: 3);
+  let final core::int #t21 = 1 in let final core::int #t22 = 2 in d{dynamic}.call(#t21, 3, z: #t22);
+  let final core::int #t23 = 1 in d{dynamic}.call(2, 3, z: #t23);
+  f(1, 2, z: 3);
+  let final core::int #t24 = 1 in let final core::int #t25 = 2 in f(#t24, 3, z: #t25);
+  let final core::int #t26 = 1 in f(2, 3, z: #t26);
+  let final self::A #t27 = a in let final core::int #t28 = 1 in let final core::int #t29 = 2 in let final core::int #t30 = 3 in #t27.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t28, #t29, z: #t30){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t31 = a in let final core::int #t32 = 1 in let final core::int #t33 = 2 in let final core::int #t34 = 3 in #t31.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t32, #t34, z: #t33){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t35 = a in let final core::int #t36 = 1 in let final core::int #t37 = 2 in let final core::int #t38 = 3 in #t35.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t37, #t38, z: #t36){(core::int, core::int, {required z: core::int}) → void};
+  a.{self::A::bar}(1, 2, z: 3){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t39 = a in let final core::int #t40 = 1 in let final core::int #t41 = 2 in #t39.{self::A::bar}(#t40, 3, z: #t41){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t42 = a in let final core::int #t43 = 1 in #t42.{self::A::bar}(2, 3, z: #t43){(core::int, core::int, {required z: core::int}) → void};
+  local(1, 2, z: 3){(core::int, core::int, {required z: core::int}) → void};
+  let final core::int #t44 = 1 in let final core::int #t45 = 2 in local(#t44, 3, z: #t45){(core::int, core::int, {required z: core::int}) → void};
+  let final core::int #t46 = 1 in local(2, 3, z: #t46){(core::int, core::int, {required z: core::int}) → void};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.transformed.expect b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.transformed.expect
new file mode 100644
index 0000000..82faf76
--- /dev/null
+++ b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.strong.transformed.expect
@@ -0,0 +1,294 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:17:21: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//     method2(foo: 1, 2); // This call.
+//                     ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:27:16: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   foo(1, z: 2, 3);
+//                ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:28:13: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   foo(z: 1, 2, 3);
+//             ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:28:16: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   foo(z: 1, 2, 3);
+//                ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:32:22: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A.foo(1, z: 2, 3);
+//                      ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:33:19: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A.foo(z: 1, 2, 3);
+//                   ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:33:22: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A.foo(z: 1, 2, 3);
+//                      ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:35:22: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B.foo(1, z: 2, 3);
+//                      ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:36:19: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B.foo(z: 1, 2, 3);
+//                   ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:36:22: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B.foo(z: 1, 2, 3);
+//                      ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:40:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A(1, z: 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:41:15: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A(z: 1, 2, 3);
+//               ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:41:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A(z: 1, 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:43:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B(1, z: 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:44:15: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B(z: 1, 2, 3);
+//               ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:44:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B(z: 1, 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:48:14: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   d(1, z: 2, 3);
+//              ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:49:11: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   d(z: 1, 2, 3);
+//           ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:49:14: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   d(z: 1, 2, 3);
+//              ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:53:14: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   f(1, z: 2, 3);
+//              ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:54:11: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   f(z: 1, 2, 3);
+//           ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:54:14: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   f(z: 1, 2, 3);
+//              ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:58:23: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.property(1, z: 2, 3);
+//                       ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:59:20: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.property(z: 1, 2, 3);
+//                    ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:59:23: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.property(z: 1, 2, 3);
+//                       ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:63:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.bar(1, z: 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:64:15: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.bar(z: 1, 2, 3);
+//               ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:64:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.bar(z: 1, 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:68:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   local(1, z: 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:69:15: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   local(z: 1, 2, 3);
+//               ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:69:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   local(z: 1, 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:77:24: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//     super.bar(1, z: 2, 3);
+//                        ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:78:21: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//     super.bar(z: 1, 2, 3);
+//                     ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:78:24: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//     super.bar(z: 1, 2, 3);
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef B = self::A;
+class A extends core::Object {
+  constructor •(core::int x, core::int y, {required core::int z = #C1}) → self::A
+    : super core::Object::•()
+    ;
+  static factory foo(core::int x, core::int y, {required core::int z = #C1}) → self::A
+    return new self::A::•(x, y, z: z);
+  get property() → (core::int, core::int, {required z: core::int}) → void
+    return throw 42;
+  method bar(core::int x, core::int y, {required core::int z = #C1}) → void {}
+}
+class Test extends self::A {
+  constructor •() → self::Test
+    : super self::A::•(1, 2, z: 3)
+    ;
+  method test() → dynamic {
+    super.{self::A::bar}(1, 2, z: 3);
+    let final core::int #t1 = 1 in let final core::int #t2 = 2 in super.{self::A::bar}(#t1, 3, z: #t2);
+    let final core::int #t3 = 1 in super.{self::A::bar}(2, 3, z: #t3);
+  }
+}
+extension E on self::A {
+  method method1 = self::E|method1;
+  tearoff method1 = self::E|get#method1;
+  method method2 = self::E|method2;
+  tearoff method2 = self::E|get#method2;
+}
+static method foo(core::int x, core::int y, {required core::int z = #C1}) → dynamic {}
+static method E|method1(lowered final self::A #this) → dynamic {
+  let final self::A #t4 = #this in let final core::int #t5 = 1 in self::E|method2(#t4, 2, foo: #t5);
+}
+static method E|get#method1(lowered final self::A #this) → () → dynamic
+  return () → dynamic => self::E|method1(#this);
+static method E|method2(lowered final self::A #this, core::int bar, {core::int? foo = #C1}) → dynamic {}
+static method E|get#method2(lowered final self::A #this) → (core::int, {foo: core::int?}) → dynamic
+  return (core::int bar, {core::int? foo = #C1}) → dynamic => self::E|method2(#this, bar, foo: foo);
+static method test(dynamic d, core::Function f, self::A a) → dynamic {
+  function local(core::int x, core::int y, {required core::int z = #C1}) → void {}
+  self::foo(1, 2, z: 3);
+  let final core::int #t6 = 1 in let final core::int #t7 = 2 in self::foo(#t6, 3, z: #t7);
+  let final core::int #t8 = 1 in self::foo(2, 3, z: #t8);
+  self::A::foo(1, 2, z: 3);
+  let final core::int #t9 = 1 in let final core::int #t10 = 2 in self::A::foo(#t9, 3, z: #t10);
+  let final core::int #t11 = 1 in self::A::foo(2, 3, z: #t11);
+  self::A::foo(1, 2, z: 3);
+  let final core::int #t12 = 1 in let final core::int #t13 = 2 in self::A::foo(#t12, 3, z: #t13);
+  let final core::int #t14 = 1 in self::A::foo(2, 3, z: #t14);
+  new self::A::•(1, 2, z: 3);
+  let final core::int #t15 = 1 in let final core::int #t16 = 2 in new self::A::•(#t15, 3, z: #t16);
+  let final core::int #t17 = 1 in new self::A::•(2, 3, z: #t17);
+  new self::A::•(1, 2, z: 3);
+  let final core::int #t18 = 1 in let final core::int #t19 = 2 in new self::A::•(#t18, 3, z: #t19);
+  let final core::int #t20 = 1 in new self::A::•(2, 3, z: #t20);
+  d{dynamic}.call(1, 2, z: 3);
+  let final core::int #t21 = 1 in let final core::int #t22 = 2 in d{dynamic}.call(#t21, 3, z: #t22);
+  let final core::int #t23 = 1 in d{dynamic}.call(2, 3, z: #t23);
+  f(1, 2, z: 3);
+  let final core::int #t24 = 1 in let final core::int #t25 = 2 in f(#t24, 3, z: #t25);
+  let final core::int #t26 = 1 in f(2, 3, z: #t26);
+  let final self::A #t27 = a in let final core::int #t28 = 1 in let final core::int #t29 = 2 in let final core::int #t30 = 3 in #t27.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t28, #t29, z: #t30){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t31 = a in let final core::int #t32 = 1 in let final core::int #t33 = 2 in let final core::int #t34 = 3 in #t31.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t32, #t34, z: #t33){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t35 = a in let final core::int #t36 = 1 in let final core::int #t37 = 2 in let final core::int #t38 = 3 in #t35.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t37, #t38, z: #t36){(core::int, core::int, {required z: core::int}) → void};
+  a.{self::A::bar}(1, 2, z: 3){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t39 = a in let final core::int #t40 = 1 in let final core::int #t41 = 2 in #t39.{self::A::bar}(#t40, 3, z: #t41){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t42 = a in let final core::int #t43 = 1 in #t42.{self::A::bar}(2, 3, z: #t43){(core::int, core::int, {required z: core::int}) → void};
+  local(1, 2, z: 3){(core::int, core::int, {required z: core::int}) → void};
+  let final core::int #t44 = 1 in let final core::int #t45 = 2 in local(#t44, 3, z: #t45){(core::int, core::int, {required z: core::int}) → void};
+  let final core::int #t46 = 1 in local(2, 3, z: #t46){(core::int, core::int, {required z: core::int}) → void};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:77:15 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:77:21 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:78:18 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:17:18 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:27:7 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:27:13 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:28:10 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:32:13 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:32:19 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:33:16 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:35:13 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:35:19 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:36:16 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:40:9 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:40:15 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:41:12 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:43:9 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:43:15 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:44:12 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:48:5 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:48:11 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:49:8 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:53:5 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:53:11 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:54:8 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:57:14 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:57:17 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:57:23 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:58:14 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:58:23 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:58:20 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:59:20 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:59:23 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:59:17 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:63:9 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:63:15 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:64:12 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:68:9 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:68:15 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:69:12 -> IntConstant(1)
+Extra constant evaluation: evaluated: 155, effectively constant: 40
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.textual_outline.expect b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.textual_outline.expect
new file mode 100644
index 0000000..903b3b6
--- /dev/null
+++ b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.textual_outline.expect
@@ -0,0 +1,23 @@
+class A {
+  A(int x, int y, {required int z});
+  factory A.foo(int x, int y, {required int z}) => new A(x, y, z: z);
+  void Function(int x, int y, {required int z}) get property => throw 42;
+  void bar(int x, int y, {required int z}) {}
+}
+
+typedef B = A;
+foo(int x, int y, {required int z}) {}
+
+extension E on A {
+  method1() {}
+  method2(int bar, {int? foo}) {}
+}
+
+test(dynamic d, Function f, A a) {}
+
+class Test extends A {
+  Test() : super(1, 2, z: 3);
+  test() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..f0b79da
--- /dev/null
+++ b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.textual_outline_modelled.expect
@@ -0,0 +1,21 @@
+class A {
+  A(int x, int y, {required int z});
+  factory A.foo(int x, int y, {required int z}) => new A(x, y, z: z);
+  void Function(int x, int y, {required int z}) get property => throw 42;
+  void bar(int x, int y, {required int z}) {}
+}
+
+class Test extends A {
+  Test() : super(1, 2, z: 3);
+  test() {}
+}
+
+extension E on A {
+  method1() {}
+  method2(int bar, {int? foo}) {}
+}
+
+foo(int x, int y, {required int z}) {}
+main() {}
+test(dynamic d, Function f, A a) {}
+typedef B = A;
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.expect b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.expect
new file mode 100644
index 0000000..c92d158
--- /dev/null
+++ b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.expect
@@ -0,0 +1,251 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:17:21: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//     method2(foo: 1, 2); // This call.
+//                     ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:27:16: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   foo(1, z: 2, 3);
+//                ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:28:13: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   foo(z: 1, 2, 3);
+//             ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:28:16: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   foo(z: 1, 2, 3);
+//                ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:32:22: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A.foo(1, z: 2, 3);
+//                      ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:33:19: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A.foo(z: 1, 2, 3);
+//                   ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:33:22: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A.foo(z: 1, 2, 3);
+//                      ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:35:22: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B.foo(1, z: 2, 3);
+//                      ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:36:19: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B.foo(z: 1, 2, 3);
+//                   ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:36:22: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B.foo(z: 1, 2, 3);
+//                      ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:40:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A(1, z: 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:41:15: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A(z: 1, 2, 3);
+//               ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:41:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A(z: 1, 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:43:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B(1, z: 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:44:15: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B(z: 1, 2, 3);
+//               ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:44:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B(z: 1, 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:48:14: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   d(1, z: 2, 3);
+//              ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:49:11: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   d(z: 1, 2, 3);
+//           ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:49:14: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   d(z: 1, 2, 3);
+//              ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:53:14: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   f(1, z: 2, 3);
+//              ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:54:11: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   f(z: 1, 2, 3);
+//           ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:54:14: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   f(z: 1, 2, 3);
+//              ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:58:23: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.property(1, z: 2, 3);
+//                       ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:59:20: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.property(z: 1, 2, 3);
+//                    ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:59:23: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.property(z: 1, 2, 3);
+//                       ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:63:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.bar(1, z: 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:64:15: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.bar(z: 1, 2, 3);
+//               ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:64:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.bar(z: 1, 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:68:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   local(1, z: 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:69:15: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   local(z: 1, 2, 3);
+//               ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:69:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   local(z: 1, 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:77:24: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//     super.bar(1, z: 2, 3);
+//                        ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:78:21: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//     super.bar(z: 1, 2, 3);
+//                     ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:78:24: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//     super.bar(z: 1, 2, 3);
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef B = self::A;
+class A extends core::Object {
+  constructor •(core::int x, core::int y, {required core::int z = #C1}) → self::A
+    : super core::Object::•()
+    ;
+  static factory foo(core::int x, core::int y, {required core::int z = #C1}) → self::A
+    return new self::A::•(x, y, z: z);
+  get property() → (core::int, core::int, {required z: core::int}) → void
+    return throw 42;
+  method bar(core::int x, core::int y, {required core::int z = #C1}) → void {}
+}
+class Test extends self::A {
+  constructor •() → self::Test
+    : super self::A::•(1, 2, z: 3)
+    ;
+  method test() → dynamic {
+    super.{self::A::bar}(1, 2, z: 3);
+    let final core::int #t1 = 1 in let final core::int #t2 = 2 in super.{self::A::bar}(#t1, 3, z: #t2);
+    let final core::int #t3 = 1 in super.{self::A::bar}(2, 3, z: #t3);
+  }
+}
+extension E on self::A {
+  method method1 = self::E|method1;
+  tearoff method1 = self::E|get#method1;
+  method method2 = self::E|method2;
+  tearoff method2 = self::E|get#method2;
+}
+static method foo(core::int x, core::int y, {required core::int z = #C1}) → dynamic {}
+static method E|method1(lowered final self::A #this) → dynamic {
+  let final self::A #t4 = #this in let final core::int #t5 = 1 in self::E|method2(#t4, 2, foo: #t5);
+}
+static method E|get#method1(lowered final self::A #this) → () → dynamic
+  return () → dynamic => self::E|method1(#this);
+static method E|method2(lowered final self::A #this, core::int bar, {core::int? foo = #C1}) → dynamic {}
+static method E|get#method2(lowered final self::A #this) → (core::int, {foo: core::int?}) → dynamic
+  return (core::int bar, {core::int? foo = #C1}) → dynamic => self::E|method2(#this, bar, foo: foo);
+static method test(dynamic d, core::Function f, self::A a) → dynamic {
+  function local(core::int x, core::int y, {required core::int z = #C1}) → void {}
+  self::foo(1, 2, z: 3);
+  let final core::int #t6 = 1 in let final core::int #t7 = 2 in self::foo(#t6, 3, z: #t7);
+  let final core::int #t8 = 1 in self::foo(2, 3, z: #t8);
+  self::A::foo(1, 2, z: 3);
+  let final core::int #t9 = 1 in let final core::int #t10 = 2 in self::A::foo(#t9, 3, z: #t10);
+  let final core::int #t11 = 1 in self::A::foo(2, 3, z: #t11);
+  self::A::foo(1, 2, z: 3);
+  let final core::int #t12 = 1 in let final core::int #t13 = 2 in self::A::foo(#t12, 3, z: #t13);
+  let final core::int #t14 = 1 in self::A::foo(2, 3, z: #t14);
+  new self::A::•(1, 2, z: 3);
+  let final core::int #t15 = 1 in let final core::int #t16 = 2 in new self::A::•(#t15, 3, z: #t16);
+  let final core::int #t17 = 1 in new self::A::•(2, 3, z: #t17);
+  new self::A::•(1, 2, z: 3);
+  let final core::int #t18 = 1 in let final core::int #t19 = 2 in new self::A::•(#t18, 3, z: #t19);
+  let final core::int #t20 = 1 in new self::A::•(2, 3, z: #t20);
+  d{dynamic}.call(1, 2, z: 3);
+  let final core::int #t21 = 1 in let final core::int #t22 = 2 in d{dynamic}.call(#t21, 3, z: #t22);
+  let final core::int #t23 = 1 in d{dynamic}.call(2, 3, z: #t23);
+  f(1, 2, z: 3);
+  let final core::int #t24 = 1 in let final core::int #t25 = 2 in f(#t24, 3, z: #t25);
+  let final core::int #t26 = 1 in f(2, 3, z: #t26);
+  let final self::A #t27 = a in let final core::int #t28 = 1 in let final core::int #t29 = 2 in let final core::int #t30 = 3 in #t27.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t28, #t29, z: #t30){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t31 = a in let final core::int #t32 = 1 in let final core::int #t33 = 2 in let final core::int #t34 = 3 in #t31.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t32, #t34, z: #t33){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t35 = a in let final core::int #t36 = 1 in let final core::int #t37 = 2 in let final core::int #t38 = 3 in #t35.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t37, #t38, z: #t36){(core::int, core::int, {required z: core::int}) → void};
+  a.{self::A::bar}(1, 2, z: 3){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t39 = a in let final core::int #t40 = 1 in let final core::int #t41 = 2 in #t39.{self::A::bar}(#t40, 3, z: #t41){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t42 = a in let final core::int #t43 = 1 in #t42.{self::A::bar}(2, 3, z: #t43){(core::int, core::int, {required z: core::int}) → void};
+  local(1, 2, z: 3){(core::int, core::int, {required z: core::int}) → void};
+  let final core::int #t44 = 1 in let final core::int #t45 = 2 in local(#t44, 3, z: #t45){(core::int, core::int, {required z: core::int}) → void};
+  let final core::int #t46 = 1 in local(2, 3, z: #t46){(core::int, core::int, {required z: core::int}) → void};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.outline.expect b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.outline.expect
new file mode 100644
index 0000000..23ee911
--- /dev/null
+++ b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.outline.expect
@@ -0,0 +1,41 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef B = self::A;
+class A extends core::Object {
+  constructor •(core::int x, core::int y, {required core::int z}) → self::A
+    ;
+  static factory foo(core::int x, core::int y, {required core::int z}) → self::A
+    ;
+  get property() → (core::int, core::int, {required z: core::int}) → void
+    ;
+  method bar(core::int x, core::int y, {required core::int z}) → void
+    ;
+}
+class Test extends self::A {
+  constructor •() → self::Test
+    ;
+  method test() → dynamic
+    ;
+}
+extension E on self::A {
+  method method1 = self::E|method1;
+  tearoff method1 = self::E|get#method1;
+  method method2 = self::E|method2;
+  tearoff method2 = self::E|get#method2;
+}
+static method foo(core::int x, core::int y, {required core::int z}) → dynamic
+  ;
+static method E|method1(lowered final self::A #this) → dynamic
+  ;
+static method E|get#method1(lowered final self::A #this) → () → dynamic
+  return () → dynamic => self::E|method1(#this);
+static method E|method2(lowered final self::A #this, core::int bar, {core::int? foo}) → dynamic
+  ;
+static method E|get#method2(lowered final self::A #this) → (core::int, {foo: core::int?}) → dynamic
+  return (core::int bar, {core::int? foo}) → dynamic => self::E|method2(#this, bar, foo: foo);
+static method test(dynamic d, core::Function f, self::A a) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.transformed.expect b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.transformed.expect
new file mode 100644
index 0000000..82faf76
--- /dev/null
+++ b/pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart.weak.transformed.expect
@@ -0,0 +1,294 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:17:21: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//     method2(foo: 1, 2); // This call.
+//                     ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:27:16: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   foo(1, z: 2, 3);
+//                ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:28:13: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   foo(z: 1, 2, 3);
+//             ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:28:16: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   foo(z: 1, 2, 3);
+//                ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:32:22: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A.foo(1, z: 2, 3);
+//                      ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:33:19: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A.foo(z: 1, 2, 3);
+//                   ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:33:22: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A.foo(z: 1, 2, 3);
+//                      ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:35:22: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B.foo(1, z: 2, 3);
+//                      ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:36:19: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B.foo(z: 1, 2, 3);
+//                   ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:36:22: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B.foo(z: 1, 2, 3);
+//                      ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:40:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A(1, z: 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:41:15: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A(z: 1, 2, 3);
+//               ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:41:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new A(z: 1, 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:43:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B(1, z: 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:44:15: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B(z: 1, 2, 3);
+//               ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:44:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   new B(z: 1, 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:48:14: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   d(1, z: 2, 3);
+//              ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:49:11: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   d(z: 1, 2, 3);
+//           ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:49:14: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   d(z: 1, 2, 3);
+//              ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:53:14: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   f(1, z: 2, 3);
+//              ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:54:11: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   f(z: 1, 2, 3);
+//           ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:54:14: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   f(z: 1, 2, 3);
+//              ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:58:23: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.property(1, z: 2, 3);
+//                       ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:59:20: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.property(z: 1, 2, 3);
+//                    ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:59:23: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.property(z: 1, 2, 3);
+//                       ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:63:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.bar(1, z: 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:64:15: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.bar(z: 1, 2, 3);
+//               ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:64:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   a.bar(z: 1, 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:68:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   local(1, z: 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:69:15: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   local(z: 1, 2, 3);
+//               ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:69:18: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//   local(z: 1, 2, 3);
+//                  ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:77:24: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//     super.bar(1, z: 2, 3);
+//                        ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:78:21: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//     super.bar(z: 1, 2, 3);
+//                     ^
+//
+// pkg/front_end/testcases/unscheduled_experiments/named_arguments_anywhere/all_kinds.dart:78:24: Error: Place positional arguments before named arguments.
+// Try moving the positional argument before the named arguments, or add a name to the argument.
+//     super.bar(z: 1, 2, 3);
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef B = self::A;
+class A extends core::Object {
+  constructor •(core::int x, core::int y, {required core::int z = #C1}) → self::A
+    : super core::Object::•()
+    ;
+  static factory foo(core::int x, core::int y, {required core::int z = #C1}) → self::A
+    return new self::A::•(x, y, z: z);
+  get property() → (core::int, core::int, {required z: core::int}) → void
+    return throw 42;
+  method bar(core::int x, core::int y, {required core::int z = #C1}) → void {}
+}
+class Test extends self::A {
+  constructor •() → self::Test
+    : super self::A::•(1, 2, z: 3)
+    ;
+  method test() → dynamic {
+    super.{self::A::bar}(1, 2, z: 3);
+    let final core::int #t1 = 1 in let final core::int #t2 = 2 in super.{self::A::bar}(#t1, 3, z: #t2);
+    let final core::int #t3 = 1 in super.{self::A::bar}(2, 3, z: #t3);
+  }
+}
+extension E on self::A {
+  method method1 = self::E|method1;
+  tearoff method1 = self::E|get#method1;
+  method method2 = self::E|method2;
+  tearoff method2 = self::E|get#method2;
+}
+static method foo(core::int x, core::int y, {required core::int z = #C1}) → dynamic {}
+static method E|method1(lowered final self::A #this) → dynamic {
+  let final self::A #t4 = #this in let final core::int #t5 = 1 in self::E|method2(#t4, 2, foo: #t5);
+}
+static method E|get#method1(lowered final self::A #this) → () → dynamic
+  return () → dynamic => self::E|method1(#this);
+static method E|method2(lowered final self::A #this, core::int bar, {core::int? foo = #C1}) → dynamic {}
+static method E|get#method2(lowered final self::A #this) → (core::int, {foo: core::int?}) → dynamic
+  return (core::int bar, {core::int? foo = #C1}) → dynamic => self::E|method2(#this, bar, foo: foo);
+static method test(dynamic d, core::Function f, self::A a) → dynamic {
+  function local(core::int x, core::int y, {required core::int z = #C1}) → void {}
+  self::foo(1, 2, z: 3);
+  let final core::int #t6 = 1 in let final core::int #t7 = 2 in self::foo(#t6, 3, z: #t7);
+  let final core::int #t8 = 1 in self::foo(2, 3, z: #t8);
+  self::A::foo(1, 2, z: 3);
+  let final core::int #t9 = 1 in let final core::int #t10 = 2 in self::A::foo(#t9, 3, z: #t10);
+  let final core::int #t11 = 1 in self::A::foo(2, 3, z: #t11);
+  self::A::foo(1, 2, z: 3);
+  let final core::int #t12 = 1 in let final core::int #t13 = 2 in self::A::foo(#t12, 3, z: #t13);
+  let final core::int #t14 = 1 in self::A::foo(2, 3, z: #t14);
+  new self::A::•(1, 2, z: 3);
+  let final core::int #t15 = 1 in let final core::int #t16 = 2 in new self::A::•(#t15, 3, z: #t16);
+  let final core::int #t17 = 1 in new self::A::•(2, 3, z: #t17);
+  new self::A::•(1, 2, z: 3);
+  let final core::int #t18 = 1 in let final core::int #t19 = 2 in new self::A::•(#t18, 3, z: #t19);
+  let final core::int #t20 = 1 in new self::A::•(2, 3, z: #t20);
+  d{dynamic}.call(1, 2, z: 3);
+  let final core::int #t21 = 1 in let final core::int #t22 = 2 in d{dynamic}.call(#t21, 3, z: #t22);
+  let final core::int #t23 = 1 in d{dynamic}.call(2, 3, z: #t23);
+  f(1, 2, z: 3);
+  let final core::int #t24 = 1 in let final core::int #t25 = 2 in f(#t24, 3, z: #t25);
+  let final core::int #t26 = 1 in f(2, 3, z: #t26);
+  let final self::A #t27 = a in let final core::int #t28 = 1 in let final core::int #t29 = 2 in let final core::int #t30 = 3 in #t27.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t28, #t29, z: #t30){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t31 = a in let final core::int #t32 = 1 in let final core::int #t33 = 2 in let final core::int #t34 = 3 in #t31.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t32, #t34, z: #t33){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t35 = a in let final core::int #t36 = 1 in let final core::int #t37 = 2 in let final core::int #t38 = 3 in #t35.{self::A::property}{(core::int, core::int, {required z: core::int}) → void}(#t37, #t38, z: #t36){(core::int, core::int, {required z: core::int}) → void};
+  a.{self::A::bar}(1, 2, z: 3){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t39 = a in let final core::int #t40 = 1 in let final core::int #t41 = 2 in #t39.{self::A::bar}(#t40, 3, z: #t41){(core::int, core::int, {required z: core::int}) → void};
+  let final self::A #t42 = a in let final core::int #t43 = 1 in #t42.{self::A::bar}(2, 3, z: #t43){(core::int, core::int, {required z: core::int}) → void};
+  local(1, 2, z: 3){(core::int, core::int, {required z: core::int}) → void};
+  let final core::int #t44 = 1 in let final core::int #t45 = 2 in local(#t44, 3, z: #t45){(core::int, core::int, {required z: core::int}) → void};
+  let final core::int #t46 = 1 in local(2, 3, z: #t46){(core::int, core::int, {required z: core::int}) → void};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
+
+Extra constant evaluation status:
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:77:15 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:77:21 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:78:18 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:17:18 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:27:7 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:27:13 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:28:10 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:32:13 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:32:19 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:33:16 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:35:13 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:35:19 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:36:16 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:40:9 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:40:15 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:41:12 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:43:9 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:43:15 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:44:12 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:48:5 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:48:11 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:49:8 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:53:5 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:53:11 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:54:8 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:57:14 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:57:17 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:57:23 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:58:14 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:58:23 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:58:20 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:59:20 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:59:23 -> IntConstant(3)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:59:17 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:63:9 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:63:15 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:64:12 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:68:9 -> IntConstant(1)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:68:15 -> IntConstant(2)
+Evaluated: VariableGet @ org-dartlang-testcase:///all_kinds.dart:69:12 -> IntConstant(1)
+Extra constant evaluation: evaluated: 155, effectively constant: 40
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index fe8d64f..1f9bcca 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -9,8 +9,6 @@
 general/error_recovery/issue_39202.crash: SemiFuzzCrash
 general/error_recovery/issue_39058.crash: SemiFuzzFailure
 regress/utf_16_le_content.crash: SemiFuzzCrash
-dart2js/late_statics: SemiFuzzFailure # dartbug.com/45854
-dart2js/late_from_dill/main: SemiFuzzFailure # dartbug.com/45854, see also https://dart-review.googlesource.com/c/sdk/+/213768
 
 constructor_tearoffs/call_instantiation: TypeCheckError
 constructor_tearoffs/lowering/invalid_redirect: VerificationError
diff --git a/pkg/front_end/tool/_fasta/additional_targets_test.dart b/pkg/front_end/tool/_fasta/additional_targets_test.dart
index e5b3b50..dabba4c 100644
--- a/pkg/front_end/tool/_fasta/additional_targets_test.dart
+++ b/pkg/front_end/tool/_fasta/additional_targets_test.dart
@@ -18,7 +18,7 @@
   String expected =
       "  ${Flags.target}=${(targets.keys.toList()..sort()).join('|')}";
   MessageCode code = messageFastaUsageLong;
-  if (!code.message.contains(expected)) {
+  if (!code.problemMessage.contains(expected)) {
     throw "Error: ${code.name} in pkg/front_end/messages.yaml doesn't contain"
         " '$expected'.";
   }
diff --git a/pkg/front_end/tool/_fasta/command_line.dart b/pkg/front_end/tool/_fasta/command_line.dart
index 61caaf3..0c8312e 100644
--- a/pkg/front_end/tool/_fasta/command_line.dart
+++ b/pkg/front_end/tool/_fasta/command_line.dart
@@ -60,6 +60,7 @@
   Options.compileSdk,
   Options.dumpIr,
   Options.enableExperiment,
+  Options.enableUnscheduledExperiments,
   Options.excludeSource,
   Options.omitPlatform,
   Options.fatal,
@@ -106,7 +107,7 @@
   final bool verbose = Options.verbose.read(parsedOptions);
 
   if (help) {
-    print(computeUsage(programName, verbose).message);
+    print(computeUsage(programName, verbose).problemMessage);
     exit(0);
   }
 
@@ -188,6 +189,9 @@
       ? NnbdMode.Agnostic
       : (nnbdStrongMode ? NnbdMode.Strong : NnbdMode.Weak);
 
+  final bool enableUnscheduledExperiments =
+      Options.enableUnscheduledExperiments.read(parsedOptions);
+
   final bool warnOnReachabilityCheck =
       Options.warnOnReachabilityCheck.read(parsedOptions);
 
@@ -247,6 +251,7 @@
     ..explicitExperimentalFlags = explicitExperimentalFlags
     ..environmentDefines = noDefines ? null : parsedOptions.defines
     ..nnbdMode = nnbdMode
+    ..enableUnscheduledExperiments = enableUnscheduledExperiments
     ..additionalDills = linkDependencies
     ..emitDeps = !noDeps
     ..warnOnReachabilityCheck = warnOnReachabilityCheck
@@ -330,7 +335,7 @@
 
   return CompilerContext.runWithOptions<T>(options, (CompilerContext c) {
     if (problem != null) {
-      print(computeUsage(programName, options.verbose).message);
+      print(computeUsage(programName, options.verbose).problemMessage);
       PlainAndColorizedString formatted =
           c.format(problem.message.withoutLocation(), Severity.error);
       String formattedText;
@@ -350,9 +355,10 @@
 Message computeUsage(String programName, bool verbose) {
   String basicUsage = "Usage: $programName [options] dartfile\n";
   String? summary;
-  String options =
-      (verbose ? messageFastaUsageLong.message : messageFastaUsageShort.message)
-          .trim();
+  String options = (verbose
+          ? messageFastaUsageLong.problemMessage
+          : messageFastaUsageShort.problemMessage)
+      .trim();
   switch (programName) {
     case "outline":
       summary =
@@ -393,7 +399,7 @@
   try {
     return await action();
   } on DebugAbort catch (e) {
-    print(e.message.message);
+    print(e.message.problemMessage);
 
     // DebugAbort should never happen in production code, so we want test.py to
     // treat this as a crash which is signalled by exiting with 255.
diff --git a/pkg/front_end/tool/_fasta/generate_messages.dart b/pkg/front_end/tool/_fasta/generate_messages.dart
index 55d233a..f75d37e 100644
--- a/pkg/front_end/tool/_fasta/generate_messages.dart
+++ b/pkg/front_end/tool/_fasta/generate_messages.dart
@@ -430,10 +430,10 @@
   if (parameters.isEmpty && conversions.isEmpty && arguments.isEmpty) {
     // ignore: unnecessary_null_comparison
     if (problemMessage != null) {
-      codeArguments.add('message: r"""$problemMessage"""');
+      codeArguments.add('problemMessage: r"""$problemMessage"""');
     }
     if (correctionMessage != null) {
-      codeArguments.add('tip: r"""$correctionMessage"""');
+      codeArguments.add('correctionMessage: r"""$correctionMessage"""');
     }
 
     return new Template("""
@@ -449,10 +449,11 @@
   List<String> templateArguments = <String>[];
   // ignore: unnecessary_null_comparison
   if (problemMessage != null) {
-    templateArguments.add('messageTemplate: r"""$problemMessage"""');
+    templateArguments.add('problemMessageTemplate: r"""$problemMessage"""');
   }
   if (correctionMessage != null) {
-    templateArguments.add('tipTemplate: r"""$correctionMessage"""');
+    templateArguments
+        .add('correctionMessageTemplate: r"""$correctionMessage"""');
   }
 
   templateArguments.add("withArguments: _withArguments$name");
@@ -462,9 +463,10 @@
   if (hasLabeler) {
     message += " + labeler.originMessages";
   }
-  messageArguments.add("message: ${message}");
+  messageArguments.add("problemMessage: ${message}");
   if (correctionMessage != null) {
-    messageArguments.add("tip: ${interpolate(correctionMessage)}");
+    messageArguments
+        .add("correctionMessage: ${interpolate(correctionMessage)}");
   }
   messageArguments.add("arguments: { ${arguments.join(', ')} }");
 
diff --git a/pkg/front_end/tool/dart_doctest_impl.dart b/pkg/front_end/tool/dart_doctest_impl.dart
index 37f4d7a..3ef774c 100644
--- a/pkg/front_end/tool/dart_doctest_impl.dart
+++ b/pkg/front_end/tool/dart_doctest_impl.dart
@@ -653,7 +653,7 @@
       location,
       endToken.charEnd - startToken.charOffset,
       source.importUri!.toString(),
-      message.message);
+      message.problemMessage);
 }
 
 CommentString extractComments(CommentToken comment, String rawString) {
diff --git a/tools/VERSION b/tools/VERSION
index 8d77ea2..4f88fa0 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 179
+PRERELEASE 180
 PRERELEASE_PATCH 0
\ No newline at end of file
